我有一个非常简单的测试方法,使用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
答案 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>();
看起来更可读恕我直言。