如何使用Rhino.Mocks模拟ControllerContext

ahs*_*ele 4 tdd asp.net-mvc unit-testing controller rhino-mocks

我正在尝试使用Rhino.Mocks模拟ControllerContext对象来访问我的控制器单元测试中的用户,请求,响应和会话等运行时对象.我写了下面的方法试图模拟一个控制器.

private TestController CreateTestControllerAs(string userName)
{
    var mock = MockRepository.GenerateStub<ControllerContext>();
    mock.Stub(con =>
        con.HttpContext.User.Identity.Name).Return(userName);
    mock.Stub(con =>
        con.HttpContext.Request.IsAuthenticated).Return(true);

    var controller = CreateTestController(); // left out of example for brevity
    controller.ControllerContext = mock;

    return controller;
 }
Run Code Online (Sandbox Code Playgroud)

但是,HttpContext我的模拟ControllerContext是空的,我试图访问HttpContext.User等导致a System.NullReferenceException.

我的嘲笑我做错了什么?

Dar*_*rov 5

我强烈建议您查看MVCContrib.TestHelper,它使用Rhino.Mocks并提供了一种优雅的方式来测试您的控制器.以下是您的测试结果:

[TestClass]
public class UsersControllerTests : TestControllerBuilder
{
    [TestMethod]
    public void UsersController_Index()
    {
        // arrange
        // TODO : this initialization part should be externalized
        // so that it can be reused by other tests
        var sut = new HomeController();
        this.InitializeController(sut);
        // At this point sut.Request, sut.Response, sut.Session, ... are
        // stubed objects on which you could define expectations.

        // act
        var actual = sut.Index();

        // assert
        actual.AssertViewRendered();
    }
}
Run Code Online (Sandbox Code Playgroud)

这是一个控制器单元测试,它是我编写的示例ASP.NET MVC应用程序的一部分.