2014-01-21 6 views
9

내가 단위 테스트에 WebAPI (중 하나로, OData) 컨트롤러에서 호출하고 HttpControllerContext에 소요됩니다 코드의 조각을 시도하고있다 :스텁 방법 HttpControllerContext

public string MethodToTest(HttpControllerContext context) 
{ 
    string pub = string.Empty; 

    if (context != null) 
    { 
     pub = context.Request.RequestUri.Segments[2].TrimEnd('/'); 
    } 

    return pub; 
} 

단위 테스트하려면를이 내가 필요 HttpControllerContext 목적. 어떻게해야합니까? 나는 처음에 Microsoft Fake를 사용하여 스텁하려고 시도했지만 HttpControllerContext에는 인터페이스가없는 것 같으므로 (그렇다면 ??), 옵션이 아닌 것 같습니다. 새 HttpControllerContext 개체를 새로 작성해야하며 생성자 매개 변수를 스텁해야할까요? (! 오히려하지 않음) 또는이에 대한 MOQ 프레임 워크를 사용

답변

19

당신은 단순히 HttpControllerContext를 인스턴스화하고 컨텍스트 경로 정보뿐만 아니라, 여기에 객체를 할당 할 수 있습니다 (당신은 모든 이들의 조롱 수) :

var controller = new TestController(); 
var config = new HttpConfiguration(); 
var request = new HttpRequestMessage(HttpMethod.Get, "http://localhost/api/test"); 
var route = config.Routes.MapHttpRoute("default", "api/{controller}/{id}"); 
var routeData = new HttpRouteData(route, new HttpRouteValueDictionary { { "controller", "test" } }); 

controller.ControllerContext = new HttpControllerContext(config, routeData, request); 
controller.Request = request; 
controller.Request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config; 

// Call your method to test 
MethodToTest(controller); 

HttpControllerContext은 단순한 컨테이너이므로 조롱받을 필요가 없습니다.

+0

HttpContext.Current는이 – Nick

+0

@ 닉을 사용하여 여전히 NULL입니다.이 경우에는 HttpContext.Current가 아니라 controller.Context를 참조해야합니다. –