Использование 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. Хотя это не прямой ответ.
Надеюсь, что это поможет.