2011-01-05 3 views
2

안녕하세요. 컨트롤러에서 내 로그 아웃 작업을 테스트하고 있지만 HttpContext에서 내 세션을 테스트하거나 스터핑하는 데 어려움이 있습니다. 내가 쉽게 MVC Contrib TestHelper을 사용하고 있지만 지금은 약간의 도움이 필요합니다. 당신은 내의 differents 시도한다을 볼 수 있습니다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()); 
    } 

:

여기 내 테스트입니다. MVCContrib의 TestHelper를 살펴볼 때 Session.Abandon()이 구현되지 않았다는 오류가 발생합니다. 하지만 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

관련 문제