2009-02-25 2 views
4

asp.net mvc rc1에서 recent ControllerContext refactoring을 활용하려고합니다. 나는 단순히 세션을 스텁 할 수 있어야하지만 난 다음 코드를 실행할 때 라인 2에 System.NullReferenceException 점점 계속 :어떻게 rhino mock으로 MVC RC1에서 HttpSessionState를 스텁합니까?

var mockContext = MockRepository.GenerateStub<ControllerContext>(); 
mockContext.Stub(x => x.HttpContext.Session["MyKey"]).Return("MyValue"); 

내가 잘못하고있는 중이 야 무엇을?

편집 : 방금이 게시물에서 rhino의 최신 버전을 가지고 있는지 확인했습니다.

답변

6

이 작업을 수행하려면 HttpContext를 조롱해야합니다. 나는 이것에 대한 HttpContext에의 모의을 사용하고 있습니다 :

public class HttpContextMock 
{ 
    private readonly HttpContextBase _contextBase; 
    private readonly HttpRequestBase _requestBase; 
    private readonly HttpResponseBase _responseBase; 
    private readonly HttpSessionStateBase _sessionStateBase; 
    private readonly HttpServerUtilityBase _serverUtilityBase; 

    public HttpContextBase Context { get { return _contextBase; } } 
    public HttpRequestBase Request { get { return _requestBase; } } 
    public HttpResponseBase Response { get { return _responseBase; } } 
    public HttpSessionStateBase Session { get { return _sessionStateBase; } } 
    public HttpServerUtilityBase Server { get { return _serverUtilityBase; } } 


    public HttpContextMock() 
    { 
     _contextBase = MockRepository.GenerateStub<HttpContextBase>(); 
     _requestBase = MockRepository.GenerateStub<HttpRequestBase>(); 
     _responseBase = MockRepository.GenerateStub<HttpResponseBase>(); 
     _sessionStateBase = MockRepository.GenerateStub<HttpSessionStateBase>(); 
     _serverUtilityBase = MockRepository.GenerateStub<HttpServerUtilityBase>(); 

     _contextBase.Stub(x => x.Request).Return(_requestBase); 
     _contextBase.Stub(x => x.Response).Return(_responseBase); 
     _contextBase.Stub(x => x.Session).Return(_sessionStateBase); 
     _contextBase.Stub(x => x.Server).Return(_serverUtilityBase); 

     _requestBase.Stub(x => x.IsAuthenticated).Return(true); 

     _contextBase.User = new GenericPrincipal(new GenericIdentity("[email protected]"), 
               new string[] {"Admin"}); 

    } 
} 

그리고 테스트의 설정에서

나는 컨트롤러의 인스턴스를 만들 :

[SetUp] 
    public override void TestSetUp() 
    { 
     base.TestSetUp(); 

     repository = MockRepository.GenerateMock<IFooRepository>(); 
     controller = new FooController() 
         { 
          FooRepository = repository, 
          UserRepository = userMockRepository 
         }; 

     controller.ControllerContext = new ControllerContext(context.Context, new RouteData(), controller); 
    } 

그리고 모두가 잘 작동하는지, 나는에 매개 변수를 추가 할 수 있습니다 세션 및 기타 여러 가지. 희망이 도움이됩니다.

관련 문제