【问题标题】:what is Unit Testing MVC4 Response Status Code什么是单元测试 MVC4 响应状态码
【发布时间】:2013-12-14 19:48:38
【问题描述】:

我有一个单元测试可以测试包含太多段的路由,但我想将其扩展为测试 Response Status Code(应该返回 404 代码)。

是否可以使用模拟的 httpContext 并检查状态码?

HttpContextMock.Object.Response.StatusCode 总是返回 0 状态码(我想是因为模拟了 HttpContext 的一部分)。

[TestMethod]
public void RouteWithTooManySegments()
{
    var routes = new RouteCollection();
    MyApp.RouteConfig.RegisterRoutes(routes);

    var httpContextMock = new Mock<HttpContextBase>();
    var httpResponseMock = new Mock<HttpResponseBase>();

    httpContextMock.Setup(c => c.Request.AppRelativeCurrentExecutionFilePath)
        .Returns("~/dawd/dawdaw/dawdaw/daw");

    RouteData routeData = routes.GetRouteData(httpContextMock.Object);

    Assert.IsNull(routeData);
}

使用ErrorController在视图中返回状态码“404”和相应的Response Status Code

public class ErrorController : Controller
{
    public ActionResult Index()
    {
        return View();
    }

    public ActionResult NotFound()
    {
        Response.StatusCode = 404;
        return View();
    }
}

Web.Config 规则

 <httpErrors errorMode="Custom" existingResponse="Replace">
  <remove statusCode="404" />
  <error statusCode="404" responseMode="ExecuteURL" path="/Error/NotFound" />
 </httpErrors>

【问题讨论】:

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


    【解决方案1】:

    下面的单元测试将验证 HttpStatusCode 将设置为 404。请注意,它必须在控制器的操作中设置,就像您在问题中所做的那样。如果您希望 Web.config 进行交互,那么它更像是一个 Web 集成测试,这是一个完全不同的测试。

    [TestMethod]
    public void RouteWithTooManySegments()
    {
        var httpContextStub = new Mock<HttpContextBase>();
        var httpResponseMock = new Mock<HttpResponseBase>();
        var controllerContextStub = new Mock<ControllerContext>();
    
        httpContextStub.Setup(x => x.Response).Returns(httpResponseMock.Object);
        controllerContextStub.Setup(x => x.HttpContext)
            .Returns(httpContextStub.Object);
    
        var sut = new ErrorController
            { ControllerContext = controllerContextStub.Object };
    
        sut.NotFound();
    
        httpResponseMock.VerifySet(x => x.StatusCode = 404);
    }
    

    【讨论】:

    • 是的,我在考虑更多关于 Web 集成测试的方向。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-07
    • 2015-07-25
    • 2023-03-14
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多