2016-12-06 18 views
3

Мне нужно выполнить тесты интеграции на 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 эксперт), он присоединяет отладчик экземпляра визуальной студии, который был открыт первым.

+0

Обновление: Я пошел маршрут раскручивается Iis экспресс и подключение отладчика. Хитрость заключалась в том, чтобы запустить iis на один поток и запрос на другой поток; контроллер попадает и отлаживается, а httpcontext.current не равен нулю. Однако это происходит только в том случае, если iis работает до запуска теста.Таким образом, когда я запускаю его без запуска iis, точка останова в контроллере не попадает, однако он попадает, когда тест запускается с ранее запущенным iis. Я уверен, что это как-то связано с процессами. – user1883961

+0

Обновление: я просто разворачиваю iis express в фоновом режиме и поддерживаю его; затем вызывается на сервер в модульных тестах. Одна странность заключается в том, что когда я присоединяюсь к отладчику (я не эксперт COM), он прикрепляет отладчик экземпляра визуальной студии, который был открыт первым. – user1883961

ответ

0

В зависимости от почему вы используете HttpContext.Current, вы можете изменить код, чтобы использовать HttpContext свойство Controller класса вместо.

Затем вы можете создать пользовательский ControllerContext для своих тестов, который также может содержать HTTP-контекст. Обратите внимание, что MVC более интеллектуальный, чем старый ASP.NET, потому что он использует HttpContextBase, который вы можете наследовать и даже издеваться над полностью настраиваемым контекстом HTTP в своих тестах.

Соответствующие ссылки:

+0

Спасибо, мы закончили тем, что просто изменили конечную точку контроллера, используя контейнер ioc, чтобы внедрить реализацию «интерфейса» интерфейса, которая возвращает тестовую версию IHttpContextManager (которая возвращает HttpContext) при тестировании, и фактический текущий HttpContext при запуске , Еще раз спасибо!!! – user1883961

 Смежные вопросы

  • Нет связанных вопросов^_^