Question

I've got a very simple test method, using MvcContrib.TestBuilder to setup the controller (and mock the HttpContext etc...)

    [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));
    }

My implementation looks as simple as:

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

        return View();
    }

However, my test is always failing, because Response.StatusCode is always 0

Even if I debug, and evaluate Response.StatusCode after Response.StatusCode = 404; it is still 0

Was it helpful?

Solution

The HttpResponse instance is a mock. So you should assert it like this:

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

instead of:

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

But instead of setting some status codes in my controller action I would simply return the proper ActionResult:

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

and test it like this:

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

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

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

Looks more readable IMHO.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top