2014-01-21 7 views
9

Ich versuche, Unit-Test ein Stück Code, der von einem WebAPI (OData) -Controller und nimmt in einem HttpControllerContext aufgerufen wird:wie Stub HttpControllerContext

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

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

    return pub; 
} 

to Unit-Test dieses i ein brauchen HttpControllerContext Objekt. Wie soll ich darüber gehen? Ich versuchte zunächst, es mit Microsoft Fakes zu stopfen, aber HttpControllerContext scheint nicht eine Schnittstelle (warum?), So dass das scheint keine Option sein. Sollte ich nur ein neues HttpControllerContext-Objekt neu erstellen und vielleicht seine Konstruktorparameter stub? (! Eher nicht) oder die Moq Rahmen dafür verwenden

Antwort

19

Sie können einfach eine HttpControllerContext instanziiert und weisen Kontext es Objekte, zusätzlich zu den Routeninformationen (Sie könnten alle diese verspotten):

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 ist einfach ein Container, so dass es nicht selbst verspottet werden muss.

+0

HttpContext.Current ist immer noch NULL für mich mit dieser – Nick

+0

@Nick, sollten Sie controller.Context in diesem Fall verweisen, nicht HttpContext.Current –