ASP.NET MVC - модульное тестирование, макетирование HttpContext без использования фиктивного фреймворка - PullRequest
6 голосов
/ 07 сентября 2010

Поскольку у меня возникли проблемы с модульным тестированием RenderPartialViewToString () с платформой Moq ( ASP.NET MVC - Модульное тестирование RenderPartialViewToString () с платформой Moq? ), я подумываю получить свой контроллер напрямуюОднако, без использования Moq для этого конкретного теста, как мне смоделировать (или установить) HttpContext для моего теста без использования какой-либо инфраструктуры Moq?

Мне нужно сделать что-то похожее на это, без Moqкурс:

    var mockHttpContext = new Mock<ControllerContext>();

    mockHttpContext.SetupGet(p => p.HttpContext.User.Identity.Name).Returns("n1\\test");
    mockHttpContext.SetupGet(p => p.HttpContext.Request.IsAuthenticated).Returns(true);

Большое спасибо.

Ответы [ 2 ]

3 голосов
/ 07 сентября 2010

Если вашему контроллеру нужна информация для аутентификации из HttpContext, я бы:

  1. Создайте новый класс, который упаковывает вызовы, которые вас интересуют. Похоже, вы хотите Имя и IsAuthenticated. Новый класс может быть AuthenticationService или чем-то еще.
  2. В методах / свойствах в AuthenticationService вызовите real HttpContext, например, HttpContext.Current.user.Identity.Name.
  3. Создать интерфейс поверх нового Служба аутентификации с публичные методы / свойства, которые вас интересуют.
  4. Внедрить службу IAuthenticationService в ваш тестируемый контроллер в конструктор Похоже, вы, возможно, уже делаете это с другими зависимостями в контроллере.
  5. Теперь вы можете издеваться IAuthenticationService и это возвращать значения без необходимости позвоните в настоящий HttpContext.

Вот больше подробностей из сообщения в блоге, которое я сделал http://www.volaresystems.com/Blog/post/2010/08/19/Dont-mock-HttpContext.aspx. Я использую RhinoMocks вместо Moq, но концепция остается той же, чтобы держаться подальше от HttpContext.

2 голосов
/ 24 февраля 2011

Вы можете смоделировать это следующим образом и объявить объект stringBuilder, который принимает выходные данные.

        var response = new Mock<HttpResponseBase>();
        response.Setup(x => x.Write(It.IsAny<string>())).Callback<string>(y => _stringBuilder.Append(y));
        var url = new Uri("http://localhost/Home/");
        var request = new Mock<HttpRequestBase>();
        request.Setup(x => x.Url).Returns(url);
        request.Setup(x => x.ApplicationPath).Returns("");
        var httpContext = new Mock<HttpContextBase>();
        httpContext.Setup(x => x.Request).Returns(request.Object);
        httpContext.Setup(x => x.Response).Returns(response.Object);

        _controllerContext = new Mock<ControllerContext>();
        _controllerContext.Setup(x => x.HttpContext).Returns(httpContext.Object);
        _homeController = autoMock.Create<HomeController>();
        _homeController.ControllerContext = _controllerContext.Object;

Вы выполняете свое действие следующим образом:

var action=_homeController.Action(<parameters>);
action.ExecuteResult();

и теперь ваш объект stringbuilder, т. Е. _StringBuilder, будет иметь результат вывода любого типа, и вы можете проверить его.

...