你如何模拟asp.net mvc管道

时间:2015-07-15 19:49:35

标签: asp.net asp.net-mvc unit-testing

您如何模拟ASP.NET MVC管道进行测试?

示例我想在控制器中对方法进行单元测试。

该方法有一个属性。

该属性是管道的一部分。

我如何模拟模拟httpcontext或mvvc管道来测试方法?

1 个答案:

答案 0 :(得分:0)

您没有说明您正在使用的模拟框架或管道的含义。这是一个如何使用FakeItEasy模拟HttpContext(和所有依赖对象)的示例。

public static HttpContextBase FakeHttpContext()
{
    var context = A.Fake<HttpContextBase>();
    var request = A.Fake<HttpRequestBase>();
    var response = A.Fake<HttpResponseBase>();
    var session = A.Fake<HttpSessionStateBase>();
    var server = A.Fake<HttpServerUtilityBase>();

    A.CallTo( () => request.QueryString ).Returns( new NameValueCollection() );
    A.CallTo( () => request.Form ).Returns( new NameValueCollection() );
    A.CallTo( () => request.Headers ).Returns( new NameValueCollection() );

    A.CallTo( () => context.Request ).Returns( request );
    A.CallTo( () => context.Response ).Returns( response );
    A.CallTo( () => context.Session ).Returns( session );
    A.CallTo( () => context.Server ).Returns( server );

    return context;
}

public static void SetFakeControllerContext( Controller controller)
{
    var httpContext = FakeHttpContext();
    ControllerContext context = new ControllerContext( new RequestContext( httpContext, new RouteData() ), controller );
    controller.ControllerContext = context;
}

然后在你的单元测试中,你调用SetFakeControllerContext传递一个控制器本身的实例。

var controller = new HomeController();
Faker.SetFakeControllerContext(controller);

如果您正在尝试测试该属性是否已执行,则不会。您可以单独测试属性和控制器。您不需要测试属性是否运行,因为它是基础结构的一部分,测试它不是您的工作。

相关问题