gpt4 book ai didi

asp.net-mvc-2 - session.clear、session.abandon 和 Rhino Mock 的 MVCContrib TestHelper 问题

转载 作者:行者123 更新时间:2023-12-04 06:38:14 27 4
gpt4 key购买 nike

嗨,我正在尝试对我的 Controller 上的注销操作进行单元测试,但是我很难在 HttpContext 中测试或 stub 我的 session 。我正在使用 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 时,巫婆是对的。但是我如何模拟或 stub 已经被 TestHelper 模拟的 session ?

NUnit 中的异常:

System.NotImplementedException : The method or operation is not implemented. at 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());
}

最佳答案

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

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

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

现在我运行我的 Controller 方法,然后使用 Rhino.Mocks 的 AAA 语法来确保调用 Abandon 方法:
controller.Session.AssertWasCalled(s => s.Abandon());

如果你想使用记录/重放语义,你可以在调用 controller.HttpContext.Replay() 之前设置你的期望值。 .

关于asp.net-mvc-2 - session.clear、session.abandon 和 Rhino Mock 的 MVCContrib TestHelper 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4609661/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com