Использование httpcontext в модульном тесте - PullRequest
13 голосов
/ 13 июля 2010

Я использую C # 4.0, и мне нужно протестировать сервис. Функция внутри сервиса возвращает путь, похожий на переменную, которую я назвал ожидаемой, это путь, который я ожидаю получить обратно. Но когда я запускаю этот тест, я получаю сообщение об ошибке, что HttpContext.Current равен NULL. Что я могу сделать, чтобы решить эту проблему, чтобы можно было запустить тест?

[TestMethod]
public void GetPathTest()
{
   var expected = System.IO.Path.GetFullPath(HttpContext.Current.Server.MapPath("~/Certificates/"));
   var path = _mockService.Setup(o => o.GetPath()).Returns(expected);
}

Ответы [ 4 ]

17 голосов
/ 13 июля 2010

В данный момент я не могу найти свою полную оболочку для HttpContext, которую я использовал ранее, но в данный момент мы просто создаем контекст для пустого запроса и оттуда идем, например:

SimpleWorkerRequest request = new SimpleWorkerRequest("","","", null, new StringWriter());
HttpContext context = new HttpContext(request);

Затем в модульном тесте инициализации или в самом модульном тесте (перед созданием ожидаемого) вы можете установить текущий HttpContext следующим образом:

HttpContext.Current = context;

Затем просто уточните поддельный контекст и возможное поддельное состояние сеанса и т. Д., Как требуется.

(Edit: это все в VS2008, Framework 3.5, кстати).

2 голосов
/ 02 ноября 2015

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

[TestMethod]
[HostType("ASP.NET")]
[UrlToTest("http://localhost:xxxx/")]
[AspNetDevelopmentServerHost("$(SolutionDir)\\xxx\\", "/")]
public void TestMethod()
{
   ...
}

Затем добавив файл Default.aspx в свой модуль юнит-теста.

Внутри метода тестирования вы можете легко получить доступк HttpContext.Если вы хотите выполнить отладку, вы можете использовать некоторые трассировки или прервать выполнение отладки с помощью инструкции System.Diagnostics.Debugger.Break ()

public void TestMethod()
{
   System.Diagnostics.Debugger.Break();

   ...
}

, а затем присоединить отладчик к процессу, как описано в MSDN: https://msdn.microsoft.com/en-us/library/vstudio/c6wf8e4z(v=vs.100).aspx

2 голосов
/ 13 июля 2010

Вы можете попробовать посмотреть атрибуты, созданные для модульного тестирования ASP.Net, например

[HostType("ASP.NET")]

Эта ссылка на MSDN довольно неплохо написана об этом

1 голос
/ 13 июля 2010

Я публикую это для справки.Это не простое решение, и в нем говорится о Duck Typing (если он крякает ..):уместно и стоит прочитать;поскольку IHttpContext отсутствует, невозможно создать реализацию тестовой среды - пока вы не решите использовать здесь библиотеку Duck TypingХотя это не прямой ответ.

Надеюсь, это поможет.

...