使用MvcContrib.TestHelpher设置Response.StatusCode

时间:2013-07-26 14:48:00

标签: asp.net-mvc mvccontrib mvccontrib-testhelper

我有一个非常简单的测试方法,使用MvcContrib.TestBuilder来设置控制器(并模拟HttpContext等...)

    [Test]
    public void http404_returns_status_code_of_404()
    {
        var builder = new TestControllerBuilder();
        controller = new ErrorController();

        builder.InitializeController(controller);

        var result = controller.Http404();

        Assert.That(controller.Response.StatusCode, Is.EqualTo(404));
    }

我的实现看起来很简单:

    public ActionResult Http404()
    {
        Response.StatusCode = 404;

        return View();
    }

但是,我的测试总是失败,因为Response.StatusCode始终为0

即使我调试,并在Response.StatusCode之后评估Response.StatusCode = 404; 它仍为0

1 个答案:

答案 0 :(得分:2)

HttpResponse实例是一个模拟。所以你应该这样断言:

controller.Response.AssertWasCalled(x => x.StatusCode = 404);

而不是:

Assert.That(controller.Response.StatusCode, Is.EqualTo(404));

但是我不会在控制器操作中设置一些状态代码,而只返回正确的ActionResult

public ActionResult Http404()
{
    return new HttpNotFoundResult();
}

并像这样测试:

// arrange
var builder = new TestControllerBuilder();
var sut = new ErrorController();
builder.InitializeController(sut);

// act
var actual = controller.Http404();

// assert
actual.AssertResultIs<HttpNotFoundResult>();

看起来更可读恕我直言。