Определить, запущен ли тест Visual Studio - PullRequest
3 голосов
/ 06 апреля 2010

Есть ли простой способ определить, выполняете ли вы в контексте теста Visual Studio, а не отладку или выпуск?

Вот сценарий - у нас есть фабричный класс, который мы интенсивно используем в нашей существующей кодовой базе, и я решил вместо рефакторинга его в каждом классе, чтобы мы могли заменить фабрику по умолчанию на фабрику, которая будет возвращать фиктивные / фальшивые объекты. может добавить что-то в сам класс фабрики, чтобы вернуть эти фиктивные объекты, если он обнаружит, что работает в «тестовом» режиме.

Ответы [ 4 ]

4 голосов
/ 06 апреля 2010

Не думаю, что стоит смешивать код тестового примера с кодом домена.

Я предлагаю вам предоставить интерфейс для вашей фабрики и реализовать макеты для этого интерфейса для целей тестирования.

Еще лучше, вы можете использовать насмешливый фреймворк, такой как RhinoMocks.

2 голосов
/ 06 апреля 2010

Я согласен с оценкой Маккабра со ссылкой на причины (я думаю, что рефакторинг того стоит), но что касается механики ...

В Visual Studio вы можете определить любое количество конфигураций, кроме «Отладка» и «Выпуск», как на уровне решения, так и на уровне проекта. Таким образом, вы можете создать конфигурацию «Testing», скорее всего, на основе конфигурации Debug. Затем создайте конфигурацию «Тестирование» в проекте, который содержит класс фабрики.

В окне свойств проекта выберите вкладку «Сборка». Выберите конфигурацию «Тестирование» и определите условный символ компиляции: «ТЕСТИРОВАНИЕ».

Теперь в вашем коде вы можете использовать

#if TESTING
     // build stubs
#else
     // build real implementations
#endif
1 голос
/ 12 сентября 2012

Вы можете проверить текущий исполняемый файл процесса. Это не очень элегантно, но работает.

if (Process.GetCurrentProcess().ProcessName.ToLower().Contains("vstest.executionengine"))
{
  // we are in a ms unit test
}
else
{
  // normal programm execution
}
1 голос
/ 08 апреля 2010

Слышали ли вы о введении зависимости или МОК? Эта ситуация, что они для .

Поэтому я бы предложил использовать контейнер IOC для предоставления ваших объектов, а не собственную фабрику. Если у вас есть особые требования к некоторым из них, вы можете поместить фабрику в контейнер IOC.

Затем вы можете настроить контейнер по-разному в своих тестах (или вообще не использовать его), и этот код останется вне вашего основного кода.

...