Мне нужно выполнить тесты интеграции на ASP.Net MVC-контроллере, который вызывает HttpContext.Current в каждом из своих методов. Я пробовал разные подходы и уже провел много исследований, хотя чувствую, что чего-то не хватает. Я пошел маршруты:Как выполнить интеграционные тесты на контроллере mvc, который вызывает httpcontext.current
- ядра Asp.Net: Я нашел хак на переполнение стека с использованием ядра asp.net тест хоста учтивость Стефан Steiger (How to get HttpContext.Current in ASP.NET Core?). Это отличное решение. Однако, при попытке внедрения и дальнейшего чтения, похоже, что это будет работать только с контроллером aspnetcore и не будет обратно совместимым. Я знаю прокладку, но не могу найти инструкции о том, как ее использовать.
- Спрятать iis express с помощью командного файла и совершения вызовов. Проблема, с которой я столкнулась, заключается в том, что мне нужно иметь возможность отлаживать тесты. Я попытался подключить отладчик визуальной студии, но по какой-то причине он не работал. Я продолжал получать сообщение в точке останова «Точка останова в настоящий момент не будет удалена. Для этого документа не были загружены символы».
- Я также исследовал, как программно запускать проект с помощью тестового контроллера, но не смог найти, как программно запустить веб-проект визуальной студии. (посмотрел на запуск с помощью процесса и msbuild)
- В настоящее время я тестирую с использованием собственного хоста owin, однако HttpContext.Current имеет нулевое значение в контроллере (очевидно). Если есть способ обойти это, это наиболее предпочтительный метод.
Любые рекомендации о том, как получить эти тесты, будут очень признательны.
Спасибо,
Edit, я прилагаю, используя следующий метод:
private static bool AttachToIIS(int tries = 10, int threadsleep = 500)
{
System.Threading.Thread.Sleep(1000);
bool isAttached = false;
int count = 0;
while (isAttached == false && count < tries)
{
_DTE dte = (_DTE)Marshal.GetActiveObject("VisualStudio.DTE.14.0");
Processes processes = dte.ActiveWindow.DTE.Debugger.LocalProcesses;
foreach (EnvDTE.Process process in processes)
{
System.Diagnostics.Debug.WriteLine("process: " + process.Name);
try
{
if (process.Name.Contains("iis"))
{
process.Attach();
isAttached = true;
}
}
catch (Exception e)
{
System.Diagnostics.Debug.WriteLine(e.Message);
}
}
System.Threading.Thread.Sleep(threadsleep);
count++;
}
return isAttached;
}
Одна странность в том, что, когда я прикрепить к отладчику (я не COM эксперт), он присоединяет отладчик экземпляра визуальной студии, который был открыт первым.
Обновление: Я пошел маршрут раскручивается Iis экспресс и подключение отладчика. Хитрость заключалась в том, чтобы запустить iis на один поток и запрос на другой поток; контроллер попадает и отлаживается, а httpcontext.current не равен нулю. Однако это происходит только в том случае, если iis работает до запуска теста.Таким образом, когда я запускаю его без запуска iis, точка останова в контроллере не попадает, однако он попадает, когда тест запускается с ранее запущенным iis. Я уверен, что это как-то связано с процессами. – user1883961
Обновление: я просто разворачиваю iis express в фоновом режиме и поддерживаю его; затем вызывается на сервер в модульных тестах. Одна странность заключается в том, что когда я присоединяюсь к отладчику (я не эксперт COM), он прикрепляет отладчик экземпляра визуальной студии, который был открыт первым. – user1883961