如何存根HttpControllerContext

我试图对从WebAPI(OData)控制器调用的一段代码进行unit testing,并接受一个HttpControllerContext:

public string MethodToTest(HttpControllerContext context) { string pub = string.Empty; if (context != null) { pub = context.Request.RequestUri.Segments[2].TrimEnd('/'); } return pub; } 

要对此进行unit testing,我需要一个HttpControllerContext对象。 我该怎么办呢? 我最初试图用Microsoft Fakes来存根,但HttpControllerContext似乎没有接口(为什么??),所以这似乎不是一个选项。 我应该只是新建一个新的HttpControllerContext对象,并可能存根其构造函数参数? 或者使用Moq框架(而不是!)

您可以简单地实例化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只是一个容器,因此不必自行模拟。