5

我有以下控制器:

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 为空。测试操作设置的状态代码的最佳方法是PageNotFound什么?

编辑:在下面发布了答案

4

3 回答 3

6

找到了一种使用 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
                         };
    };
}

不是很优雅。如果您能想到更好的方法 - 请告诉我。

于 2011-09-29T12:10:22.437 回答
3

您可以使用:

_controller.Response.StatusCode
于 2011-09-29T11:10:32.253 回答
3

使用MvcContrib的 TestControllerBuilder 的另一个选项...

var myController = new MyController();

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

然后使用 NUnit(我猜 Moq 版本会像你拥有的那样工作)......

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

所有丑陋的设置和模拟工作仍在完成,但由 MvcContrib 而不是在测试内部完成。这是一篇关于使用 TestControllerBuilder的帖子。

于 2011-12-06T16:03:27.447 回答