Как мне заглушить HttpSessionState в MVC RC1 с насмешками носорога? - PullRequest
4 голосов
/ 25 февраля 2009

Я пытаюсь воспользоваться недавним рефакторингом ControllerContext в asp.net mvc rc1. Я должен быть в состоянии заглушить сессию довольно просто, но я продолжаю получать System.NullReferenceException в строке 2 при выполнении следующего кода:

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

Что я делаю не так?

Редактировать: Я только что подтвердил, что у меня последняя версия Rhino на этот пост.

1 Ответ

6 голосов
/ 14 марта 2009

Вам также нужно смоделировать 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("a@a.a"),
                                                 new string[] {"Admin"});

    }
}

А в SetUp теста я создаю экземпляр контроллера:

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

И все работает нормально, я могу добавить параметры в сессию и многое другое. Надеюсь, это поможет.

...