2

こんにちは、コントローラーでログアウトアクションを単体テストしようとしていますが、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 によって既にモックされているセッションをモックまたはスタブするにはどうすればよいでしょうか?

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());
    }
4

1 に答える 1

3

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()

于 2011-01-15T19:23:23.037 に答える