我正在尝试对从WebAPI(OData) Controller 调用并接受HttpControllerContext的一段代码进行单元测试:
public string MethodToTest(HttpControllerContext context)
{
string pub = string.Empty;
if (context != null)
{
pub = context.Request.RequestUri.Segments[2].TrimEnd('/');
}
return pub;
}
为了对此进行单元测试,我需要一个HttpControllerContext对象。我该怎么办?我最初尝试使用Microsoft Fakes对其进行 stub ,但是HttpControllerContext似乎没有接口(interface)(为什么?),因此这似乎不是一个选择。我应该只是新建一个新的HttpControllerContext对象,还是将其构造函数参数 stub ?或为此使用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
只是一个容器,因此它本身不必被 mock 。