Asp.net mvc 2 session.clear、session.About和Rhino Mock的MVCContrib TestHelper问题

Asp.net mvc 2 session.clear、session.About和Rhino Mock的MVCContrib TestHelper问题,asp.net-mvc-2,nunit,rhino-mocks,mvccontrib-testhelper,Asp.net Mvc 2,Nunit,Rhino Mocks,Mvccontrib Testhelper,您好,我正在尝试在控制器上对我的注销操作进行单元测试,但是我很难在HttpContext中测试或存根我的会话。我过去一直想让事情变得更简单,但现在我需要一些帮助 这是我的测试: [TestFixture] public class SessionControllerTest { private ISession _session; private IConfigHelper _configHelper; private IAuthe

您好,我正在尝试在控制器上对我的注销操作进行单元测试,但是我很难在HttpContext中测试或存根我的会话。我过去一直想让事情变得更简单,但现在我需要一些帮助

这是我的测试:

[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());
    }
[TestFixture]
公共类SessionControllerTest
{
非公开会议;
专用IConfigHelper\u configHelper;
专用IAAuthenticationService\u authService;
//私人IMailHelper\u mailHelper;
私人ICryptographer_crypto;
专用会话控制器(U控制器);
私人TestControllerBuilder\u builder;
私有MockRepository\u mock;
[设置]
公共作废设置()
{
_mock=新的MockRepository();
_会话=_mock.DynamicMock();
_configHelper=_mock.DynamicMock();
_authService=_mock.DynamicMock();
//_mailHelper=_mock.DynamicMock();
_加密=_mock.DynamicMock();
_控制器=新的SessionController(\u authService、\u session、\u crypto、\u configHelper);
_builder=新的TestControllerBuilder();
_builder.InitializeController(_controller);
}
[测试]
公共无效注销\u 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.放弃();
LastCall.Repeat.Any();
//_Stub(s=>s.Clear());
//_Stub(s=>s.about());
//_builder.Session.Clear();
//LastCall.Repeat.Once();
//_builder.Session.放弃();
//LastCall.Repeat.Once();
_mock.ReplayAll();
var result=_controller.Logout();
_mock.VerifyAll();
result.AssertActionRedirect().ToAction(c=>c.Login());
}
你可以看到我的不同尝试。我得到一个错误,告诉我Session.about()未实现,当你查看MVCContrib的TestHelper时,witch是正确的。但是我如何模拟或存根已经被TestHelper模拟的会话呢

NUnit中的例外情况:

System.NotImplementedException: 方法或操作不可用 已实施。在 MvcContrib.TestHelper.MockSession.adjust()

谢谢你的帮助

编辑:这是新的工作测试

[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());
    }
[测试]
公共无效注销\u ReturnRedirectToAction()
{
_builder.InitializeController(_controller);
var mockSession=_mock.Stub();
_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.放弃();
LastCall.Repeat.Once();
_mock.ReplayAll();
var result=_controller.Logout();
_mock.VerifyAll();
result.AssertActionRedirect().ToAction(c=>c.Login());
}

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

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

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

如果您想使用录制/重播语义,可以在调用
controller.HttpContext.replay()

之前设置期望值。谢谢您,Patrick,它工作得很好!我不知道BackToRecord()。
controller.Session.AssertWasCalled(s => s.Abandon());