如何存根HttpControllerContext

ste*_*jnl 11 c# stub asp.net-web-api microsoft-fakes

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

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

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

    return pub;
}
Run Code Online (Sandbox Code Playgroud)

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

Kar*_*ath 22

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);
Run Code Online (Sandbox Code Playgroud)

HttpControllerContext 只是一个容器,所以它不必自己嘲笑.