Как я могу издеваться над Request.Url.GetLeftPart (), чтобы мой модульный тест прошел - PullRequest
4 голосов
/ 09 марта 2011

мой код делает это

string domainUrl = HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority);
int result = string.Compare(domainUrl, "http://www.facebookmustdie.com");
// do something with the result...

Как я могу поиграть с этим, чтобы мой модульный тест прошел, нужно ли мне издеваться над всем классом HttpContext? И если бы это было так, как бы я вставил это в код, чтобы «правильный» HttpContext использовался при запуске модульного теста

Ответы [ 5 ]

14 голосов
/ 09 марта 2011

Вам не нужно издеваться над этим:

        var sb = new StringBuilder();
        TextWriter w = new StringWriter(sb);
        var context = new HttpContext(new HttpRequest("", "http://www.example.com", ""), new HttpResponse(w));

        HttpContext.Current = context;

        Console.WriteLine(HttpContext.Current.Request.Url.GetLeftPart(UriPartial.Authority));
2 голосов
/ 09 марта 2011

Синглтон HttpContext не может быть легко смоделирован и не очень хорошо подходит для модульного тестирования, потому что он связывает вас с инфраструктурой IIS.

Это правда, что Кроты тоже могут выполнять эту работу, ноистинная проблема заключается в тесном взаимодействии с IIS.

Вы должны скорее передать соответствующие данные запроса (url для примера в вашем случае) в вашу функцию или класс, чтобы иметь возможность изолировать вашу логику от инфраструктуры,Таким образом, вы сможете отделить его от IIS и легко запустить в тестовой инфраструктуре.

0 голосов
/ 28 марта 2016

Пример для выше:

namespace Tests
{
   [TestClass()]
   public class MyTests
   {
      [ClassInitialize()]
      public static void Init(TestContext context)
      {
        // mock up HTTP request
        var sb = new StringBuilder();
        TextWriter w = new StringWriter(sb);
        var httpcontext = new HttpContext(new HttpRequest("", "http://www.example.com", ""), new HttpResponse(w));

        HttpContext.Current = httpcontext;

      }
      [TestMethod()]
      public void webSerivceTest()
      {
        // the httpcontext will be already set for your tests :)
      }
   }
}
0 голосов
/ 09 марта 2011

Я не знаю, для какого типа проекта вы пишете этот код, но если это проект MVC, я бы предложил переписать ваш код, чтобы использовать вместо него HttpContextBase - если это возможно.Затем вы можете создать заглушку или макет этого и ввести это для ваших тестов.Request.Url возвращает System.Uri, поэтому вам придется создать экземпляр этого и установить его в своем контексте заглушка / макет.

0 голосов
/ 09 марта 2011

В основном, есть две возможности:

  1. Используйте TypeMock Isolator или Родинок , чтобы высмеивать HttpContext.
  2. Введите интерфейс для всего класса HttpContext или только для UrlHelper и передайте экземпляр класса, который реализует этот интерфейс, в ваш класс. Ключевое слово: Внедрение зависимостей (DI)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...