Как проверить код состояния HTTP, установленный действием ASP.NET MVC с MSpec - PullRequest
5 голосов
/ 29 сентября 2011

У меня есть следующий контроллер:

public sealed class SomeController : Controller
{
    public ActionResult PageNotFound()
    {
        Response.StatusCode = 404;

        return View("404");
    }
}

Я создал спецификацию MSpec:

[Subject(typeof (SomeController))]
public class when_invalid_page_is_requested : SomeControllerSpec
{
    Because of = () => result = Controller.PageNotFound();

    It should_set_status_code_to_404 = 
        () => Controller.Response.StatusCode.ShouldEqual(404);
}

public abstract class SomeControllerSpec
{
    protected static HomeController Controller;

    Establish context = () => { Controller = new SomeController(); };
}

Но из-за того, как я создаю экземпляр контроллера, HttpContext имеет значение null. Как лучше всего проверить код состояния, установленный действием PageNotFound?

РЕДАКТИРОВАТЬ: Опубликовано ответ ниже

Ответы [ 3 ]

6 голосов
/ 29 сентября 2011

Нашел способ сделать это с помощью Moq.

[Subject(typeof (SomeController))]
public class when_invalid_page_is_requested : SomeControllerSpec
{
    Because of = () => result = Controller.PageNotFound();

    It should_set_status_code_to_404 = 
        () => HttpResponse.VerifySet(hr => hr.StatusCode = 404);
}

public abstract class SomeControllerSpec
{
    protected static SomeController Controller;
    protected static Mock<ControllerContext> ControllerContext;
    protected static Mock<HttpResponseBase> HttpResponse;

    Establish context = () =>
    {
        ControllerContext = new Mock<ControllerContext>();
        HttpResponse = new Mock<HttpResponseBase>();
        ControllerContext.SetupGet(cc => cc.HttpContext.Response)
                         .Returns(HttpResponse.Object);

        Controller = new SomeController
                         {
                             ControllerContext = ControllerContext.Object
                         };
    };
}

Не очень элегантно. Если вы можете придумать лучший способ - дайте мне знать.

3 голосов
/ 06 декабря 2011

Другая опция, использующая MvcContrib TestControllerBuilder ...

var myController = new MyController();

var testControllerBuilder = new TestControllerBuilder();
testControllerBuilder.InitializeController(myController);

, а затем с помощью NUnit (я думаю, версия Moq будет работать так же, как у вас) ...

myController.Response.AssertWasCalled( response => response.StatusCode = 400 );

Вся уродливая работа по настройке и макету все еще выполняется, но MvcContrib, а не внутри теста. Вот сообщение о с использованием TestControllerBuilder .

3 голосов
/ 29 сентября 2011

Вы можете использовать:

_controller.Response.StatusCode
...