Использование httpcontext в unit test

Я использую С# 4.0, и мне нужно unit test услугу. Функция внутри службы возвращает путь, похожий на переменную i, называемую ожидаемой, это путь, который я ожидаю вернуться. Но когда я запускаю этот тест, я получаю ошибку, что 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);
}

Ответы

Ответ 1

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

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

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

HttpContext.Current = context;

Затем просто создайте фальшивый контекст и возможное фальшивое состояние сеанса и т.д. по мере необходимости.

(Edit: все это в VS2008, фреймворк 3.5 кстати).

Ответ 2

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

[HostType("ASP.NET")]

Эта ссылка на MSDN имеет неплохую рецензию об этом

Ответ 3

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

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

Затем добавьте файл Default.aspx в ваш проект unit test.

Внутри тестового метода вы можете легко получить доступ к 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

Ответ 4

Я отправляю это для справки. Это не простое решение, а разговоры о Duck Typing (если это ошеломляет..):

http://haacked.com/archive/2007/08/19/why-duck-typing-matters-to-c-developers.aspx

http://haacked.com/archive/2007/09/09/ihttpcontext-and-other-interfaces-for-your-duck-typing-benefit.aspx

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

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