Установка свойств по ложному HttpContextBase - PullRequest
3 голосов
/ 04 августа 2009

Я работаю над приложением ASP.NET MVC и пытаюсь написать некоторые модульные тесты для действий контроллера, некоторые из которых манипулируют свойствами в HttpContext, такими как Session, Request.Cookies, Response.Cookies и т. Д. У меня возникли проблемы с выяснением, как «Упорядочить, Действовать, Утвердить» ... Я вижу, как устроить и Утвердить ... но у меня возникли проблемы с выяснением, как «Действовать» на свойства макета HttpContextBase, когда все из его свойств есть только добытчики. Я не могу установить что-либо в моём смоделированном контексте в действиях моего контроллера ... так что это не кажется очень полезным. Я довольно новичок в издевательстве, поэтому я уверен, что есть кое-что, чего мне не хватает, но мне кажется логичным, что я должен быть в состоянии создать фиктивный объект, который я могу использовать в контексте тестирования действий контроллера, где я может на самом деле установить значения свойств, а затем утверждать, что они все равно, что я им установил, или что-то в этом роде. Чего мне не хватает?

    public static HttpContextBase GetMockHttpContext()
    {
        var requestCookies = new Mock<HttpCookieCollection>();
        var request = new Mock<HttpRequestBase>();
        request.Setup(r => r.Cookies).Returns(requestCookies.Object);
        request.Setup(r => r.Url).Returns(new Uri("http://example.org"));

        var responseCookies = new Mock<HttpCookieCollection>();
        var response = new Mock<HttpResponseBase>();
        response.Setup(r => r.Cookies).Returns(responseCookies.Object);

        var context = new Mock<HttpContextBase>();

        context.Setup(ctx => ctx.Request).Returns(request.Object);
        context.Setup(ctx => ctx.Response).Returns(response.Object);
        context.Setup(ctx => ctx.Session).Returns(new Mock<HttpSessionStateBase>().Object);
        context.Setup(ctx => ctx.Server).Returns(new Mock<HttpServerUtilityBase>().Object);
        context.Setup(ctx => ctx.User).Returns(GetMockMembershipUser());
        context.Setup(ctx => ctx.User.Identity).Returns(context.Object.User.Identity);
        context.Setup(ctx => ctx.Response.Output).Returns(new StringWriter());

        return context.Object;
    }

Ответы [ 2 ]

4 голосов
/ 07 апреля 2010

Не уверен, если кто-то заинтересован, но я перевел Moq FakeHttpContext на один, используя Rhino Mocks (мое оружие выбора).

public static HttpContextBase FakeHttpContext()
        {
            var httpContext = MockRepository.GenerateMock<HttpContextBase>();
            var request = MockRepository.GenerateMock<HttpRequestBase>();
            var response = MockRepository.GenerateMock<HttpResponseBase>();
            var session = MockRepository.GenerateMock<HttpSessionStateBase>();
            var server = MockRepository.GenerateMock<HttpServerUtilityBase>();
            var cookies = new HttpCookieCollection();
            response.Stub(r => r.Cookies).Return(cookies);
            request.Stub(r => r.Cookies).Return(cookies);
            request.Stub(r => r.Url).Return(new Uri("http://test.com"));

            httpContext.Stub(x => x.Server).Return(server);
            httpContext.Stub(x => x.Session).Return(session);
            httpContext.Stub(x => x.Request).Return(request);
            httpContext.Stub(x => x.Response).Return(response);
            var writer = new StringWriter();
            var wr = new SimpleWorkerRequest("", "", "", "", writer);
            System.Web.HttpContext.Current = new System.Web.HttpContext(wr);
            return httpContext;

        }

с использованием в модульном тесте

_httpContext = FakeHttpContext();
var cookieManager = new CookieManager(_httpContext);
string username = cookieManager.GetUsername();
_httpContext.AssertWasCalled(hc => { var dummy = hc.Request; });
2 голосов
/ 04 августа 2009

Эй, я думаю, что вы просто испытываете некоторую потерю связи здесь, ничего страшного. То, что вы описываете, возможно на 100%.

Я не совсем уверен, почему вы не можете установить свойства для своих Mocks, но если вы опубликуете полный код для своего теста, я был бы рад пройти с вами его. Сверху головы я предложу две вещи:

  1. Существует разница между Setup () и SetupProperty (). SetupProperty (), вероятно, то, что вам нужно, если вы хотите отслеживать значения в свойствах, а не просто получать значения из них один раз.

  2. В качестве альтернативы попробуйте вызвать SetupAllProperties () для любого макета, для которого необходимо установить свойство.

Проверьте также быстрый запуск *1016* для некоторых примеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...