2011-01-05 6 views
2

こんにちは私のコントローラで私のログアウトアクションをユニットテストしようとしていますが、HttpContextでセッションをテストしたりスタブするのは難しい時があります。私はそれを簡単にするためにMVC Contrib TestHelperを使用していますが、今は少し助けが必要です。あなたは私の貴様のattempsを見ることができますMVCContrib TestHelper session.clear、session.abandon、Rhino Mockの問題

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

は助けてくれてありがとう!

編集:ここで私はMvcContribを使用するのでそれはしばらくしている新しい作業テスト

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

答えて

3

ですので、私は最新のコードをプルダウンし、簡単なテストプロジェクトを作りました。それは非常に奇妙です。 MvcContribコード(特にTestControllerBuilder)を見ると、ほとんどのオブジェクト(リクエスト、レスポンス、サーバーなど)のモックが作成されますが、Sessionでは作成されません。なぜこのことが分かりません - おそらくクリエイターに尋ねる必要があります。

しかし、あなた自身で嘲笑する方法があります。独自の模擬セッションを作成して、コントローラにMvcContrib.TestHelpersの代わりにあなたのものを使用するように指示することができます。ここで私は私のテストでやったことだ:

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

は今、私は私のコントローラメソッドを実行し、その後破棄メソッドが呼び出されたことを確認させるためのRhino.Mocks' AAAの構文を使用します。

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

あなたがしたい場合はレコード/再生セマンティクスを使用する場合は、controller.HttpContext.Replay()を呼び出す前に期待値を設定することができます。

+0

ありがとう、パトリック、それは素晴らしい作品です!私はBackToRecord()について知りませんでした。 – VinnyG

関連する問題