【问题标题】:Unit testing HttpStatusCode in MVC4 'System.NullReferenceException'MVC4 'System.NullReferenceException' 中的单元测试 HttpStatusCode
【发布时间】:2013-08-06 14:24:07
【问题描述】:

我正在尝试在 MVC4 中对 HttpStatusCodes 进行单元测试,但是当控制器尝试在 Response 上设置状态代码时,我不断收到“System.NullReferenceException”,这是有道理的,因为直接调用了该操作。如果不把它变成一个集成测试,我这辈子都想不出怎么做。一定有人这样做过,有什么想法吗?请参阅下面的现有代码。

控制器

public ActionResult Index()
{
    Response.StatusCode = (int)HttpStatusCode.ServiceUnavailable;
    Response.Headers.Add("Retry-After", "120");

    return View();
}

测试

[Test]
public void IndexActionShouldReturn503StatusCode()
{
    //Given
    var controller = new HomeController();

    //When
    var result = controller.Index() as HttpStatusCodeResult;

    //Then
    result.StatusCode.Should().Be((int)HttpStatusCode.ServiceUnavailable);
}

注意 要求是友好的“站点关闭”页面,因此我需要返回视图和状态代码。

【问题讨论】:

    标签: unit-testing asp.net-mvc-4 nunit moq


    【解决方案1】:

    您正在返回 ViewResult,然后尝试在单元测试中将其转换为 HttpStatusCodeResult。尝试返回 HttpStatusCodeResult 而不是视图。

    public ActionResult Index()
    {
        Response.Headers.Add("Retry-After", "120");
        return new HttpStatusCodeResult(HttpStatusCode.ServiceUnavailable);
    }
    

    【讨论】:

    • 该应用程序的目的是提供一个友好的“站点关闭”页面,该页面会产生 503,除非我通过返回一个 HttpStatusCodeResult 弄错了(或遗漏了一些东西,这可能更有可能)我可以不提供我更友好的页面?
    • @TomRiley 你是对的。如果你想这样做,你可能需要改变你的单元测试来检查Response.StatusCode。但是您可能需要模拟 HttpContext 以便有一个对象进行单元测试(如果您还没有)
    猜你喜欢
    • 1970-01-01
    • 2014-01-16
    • 1970-01-01
    • 1970-01-01
    • 2022-10-01
    • 2020-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多