【问题标题】:MVCContrib TestHelper problem with session.clear, session.abandon and Rhino Mocksession.clear、session.abandon 和 Rhino Mock 的 MVCContrib TestHelper 问题
【发布时间】:2011-01-17 23:01:29
【问题描述】:

您好,我正在尝试对我的控制器上的注销操作进行单元测试,但我很难在 HttpContext 中测试或存根我的会话。我正在使用MVC Contrib TestHelper 来简化它,但现在我需要一点帮助。

这是我的测试:

[TestFixture]
    public class SessionControllerTest
    {
        private ISession _session;
        private IConfigHelper _configHelper;
        private IAuthenticationService _authService;
        //private IMailHelper _mailHelper;
        private ICryptographer _crypto;
        private SessionController _controller;
        private TestControllerBuilder _builder;
        private MockRepository _mock;
    [SetUp]
    public void Setup()
    {
        _mock = new MockRepository();
        _session = _mock.DynamicMock<ISession>();
        _configHelper = _mock.DynamicMock<IConfigHelper>();
        _authService = _mock.DynamicMock<IAuthenticationService>();
        //_mailHelper = _mock.DynamicMock<IMailHelper>();
        _crypto = _mock.DynamicMock<ICryptographer>();
        _controller = new SessionController(_authService, _session, _crypto, _configHelper);
        _builder = new TestControllerBuilder();
        _builder.InitializeController(_controller);
    }
[Test]
        public void Logout_ReturnRedirectToAction()
        {
        _builder.InitializeController(_controller);

        _authService.SignOut();
        LastCall.Repeat.Once();
        _builder.Session["memberNumber"] = string.Empty;
        LastCall.Repeat.Once();
        _controller.Session.Clear();
        LastCall.Repeat.Any();
        _controller.Session.Abandon();
        LastCall.Repeat.Any();
        //_builder.Session.Stub(s => s.Clear());
        //_builder.Session.Stub(s => s.Abandon());
        //_builder.Session.Clear();
        //LastCall.Repeat.Once();
        //_builder.Session.Abandon();
        //LastCall.Repeat.Once();

        _mock.ReplayAll();
        var result = _controller.Logout();

        _mock.VerifyAll();
        result.AssertActionRedirect().ToAction<SessionController>(c => c.Login());
    }

你可以看到我的不同尝试。我收到一条错误消息,告诉我 Session.Abandon() 未实现,当您查看 MVCContrib 的 TestHelper 时,女巫是正确的。但是如何模拟或存根已经被 TestHelper 模拟的 Session?

NUnit 中的异常:

System.NotImplementedException: 方法或操作不是 实施的。在 MvcContrib.TestHelper.MockSession.Abandon()

感谢您的帮助!

编辑:这是新的工作测试

[Test]
    public void Logout_ReturnRedirectToAction()
    {
        _builder.InitializeController(_controller);
        var mockSession = _mock.Stub<HttpSessionStateBase>();

        _controller.HttpContext.BackToRecord();
        _controller.HttpContext.Stub(c => c.Session).Return(mockSession);
        _controller.HttpContext.Replay();

        _authService.SignOut();
        LastCall.Repeat.Once();
        _builder.Session["memberNumber"] = string.Empty;
        _controller.Session.Clear();
        LastCall.Repeat.Once();
        _controller.Session.Abandon();
        LastCall.Repeat.Once();

        _mock.ReplayAll();
        var result = _controller.Logout();

        _mock.VerifyAll();
        result.AssertActionRedirect().ToAction<SessionController>(c => c.Login());
    }

【问题讨论】:

    标签: asp.net-mvc-2 nunit rhino-mocks mvccontrib-testhelper


    【解决方案1】:

    我已经有一段时间没有使用 MvcContrib 了,所以我拉下最新的代码并做了一个快速测试项目。这很奇怪。查看 MvcContrib 代码(特别是 TestControllerBuilder),它为大多数对象(请求、响应、服务器等)创建模拟,但不是为会话创建模拟。我不知道为什么会这样——可能要问创作者。

    但是,有一种方法可以自己模拟它。您可以创建自己的模拟会话并告诉控制器使用您的模拟会话,而不是来自 MvcContrib.TestHelpers 的模拟会话。这是我在测试中所做的:

    var mockSession = MockRepository.GenerateStub<HttpSessionStateBase>();
    controller.HttpContext.BackToRecord();
    controller.HttpContext.Stub(c => c.Session).Return(mockSession);
    controller.HttpContext.Replay();
    

    现在我运行我的控制器方法,然后使用 Rhino.Mocks 的 AAA 语法来确保调用了 Abandon 方法:

    controller.Session.AssertWasCalled(s => s.Abandon());
    

    如果您想使用记录/重播语义,您可以在致电controller.HttpContext.Replay() 之前设置您的期望。

    【讨论】:

    • 谢谢帕特里克,效果很好!我不知道 BackToRecord()。
    猜你喜欢
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多