У меня есть модульный тест (nUnit). На многих уровнях стека вызовов метод не сработает, если он выполняется через модульный тест.
В идеале вы должны использовать что-то вроде насмешек для настройки объекта, от которого зависит этот метод, но это сторонний код, и я не могу сделать это без большой работы.
Я не хочу настраивать специальные методы nUnit - здесь слишком много уровней, и это плохой способ выполнять модульный тест.
Вместо этого я хотел бы добавить что-то подобное глубоко в стек вызовов
#IF DEBUG // Unit tests only included in debug build
if (IsRunningInUnitTest)
{
// Do some setup to avoid error
}
#endif
Итак, есть идеи о том, как написать IsRunningInUnitTest?
PS Я полностью осознаю, что это не лучший дизайн, но я думаю, что он лучше, чем альтернативы.
c#
reflection
nunit
Райан
источник
источник
Ответы:
Я делал это раньше - мне приходилось зажимать нос при этом, но я сделал это. Прагматизм всегда побеждает догматизм. Конечно, если это хороший способ , вы можете реорганизовать , чтобы избежать этого, это было бы здорово.
В основном у меня был класс «UnitTestDetector», который проверял, загружена ли сборка фреймворка NUnit в текущий домен приложения. Это нужно было сделать только один раз, а затем кешировать результат. Уродливо, но просто и эффективно.
источник
AppDomain.GetAssemblies
и проверял соответствующую сборку - для MSTest вам нужно будет посмотреть, какие сборки загружены. Взгляните на ответ Райана для примера.Взяв идею Джона, я пришел к выводу:
Сдохни сзади, мы все достаточно большие мальчики, чтобы распознать, когда мы делаем то, чего, вероятно, не должны;)
источник
Адаптировано из ответа Райана. Это для среды модульного тестирования MS.
Причина, по которой мне это нужно, заключается в том, что я показываю MessageBox при ошибках. Но мои модульные тесты также проверяют код обработки ошибок, и я не хочу, чтобы MessageBox появлялся при запуске модульных тестов.
А вот юнит-тест для этого:
источник
Упростив решение Райана, вы можете просто добавить следующее статическое свойство к любому классу:
источник
Я использую тот же подход, что и таллсет
Это базовый код, который можно легко изменить, включив кеширование. Еще одна хорошая идея - добавить сеттер
IsRunningInUnitTest
и вызватьUnitTestDetector.IsRunningInUnitTest = false
главную точку входа в ваш проект, чтобы избежать выполнения кода.источник
Может быть, полезно проверить текущее имя процесса:
И эту функцию тоже нужно проверить с помощью unittest:
Ссылки:
Мэтью Уотсон в http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/11e68468-c95e-4c43-b02b-7045a52b407e/
источник
|| processName.StartsWith("testhost") // testhost.x86
для VS 2019В тестовом режиме
Assembly.GetEntryAssembly()
вроде бы естьnull
.Обратите внимание: если
Assembly.GetEntryAssembly()
естьnull
, тоAssembly.GetExecutingAssembly()
нет.В документации говорится:
GetEntryAssembly
метод может возвращаться,null
когда управляемая сборка загружена из неуправляемого приложения.источник
Где-то в тестируемом проекте:
Где-то в вашем проекте модульного тестирования:
Элегантный, нет. Но просто и быстро.
AssemblyInitializer
для MS Test. Я ожидал бы, что у других тестовых фреймворков будут эквиваленты.источник
IsRunningInUnitTest
для этих доменов приложений не устанавливается значение true.Я использую это только для пропуска логики, которая отключает все TraceAppenders в log4net во время запуска, когда не подключен отладчик. Это позволяет модульным тестам регистрироваться в окне результатов Resharper даже при работе в режиме без отладки.
Метод, использующий эту функцию, вызывается либо при запуске приложения, либо при запуске тестового устройства.
Он похож на сообщение Райана, но использует LINQ, отбрасывает требование System.Reflection, не кэширует результат и является частным для предотвращения (случайного) неправильного использования.
источник
Наличие ссылки на структуру nunit не означает, что тест действительно запущен. Например, в Unity, когда вы активируете тесты в режиме воспроизведения, в проект добавляются ссылки на nunit. И когда вы запускаете игру, ссылки существуют, поэтому UnitTestDetector не будет работать правильно.
Вместо проверки сборки nunit мы можем попросить nunit api проверить, выполняется ли код сейчас тест или нет.
Редактировать:
Помните, что TestContext может быть автоматически сгенерирован, если это необходимо.
источник
Просто используйте это:
В тестовом режиме он вернет false.
источник
Я был недоволен этой проблемой недавно. Я решил это немного по-другому. Во-первых, я не хотел делать предположение, что фреймворк nunit никогда не будет загружен вне тестовой среды; Меня особенно беспокоили разработчики, запускающие приложение на своих машинах. Поэтому вместо этого я прошелся по стеку вызовов. Во-вторых, я был в состоянии сделать предположение, что тестовый код никогда не будет запускаться для двоичных файлов выпуска, поэтому я убедился, что этот код не существует в системе выпуска.
источник
работает как шарм
.
источник
Модульные тесты пропускают точку входа в приложение. По крайней мере, для wpf, winforms и консольное приложение
main()
не вызываются.Если вызывается основной метод, то мы находимся во время выполнения , иначе мы находимся в режиме модульного тестирования :
источник
Учитывая, что ваш код обычно выполняется в основном (gui) потоке приложения Windows Forms, и вы хотите, чтобы он вел себя по-другому во время работы в тесте, вы можете проверить
Я использую это для кода, который я хочу использовать
fire and forgot
в приложении с графическим интерфейсом, но в модульных тестах мне может потребоваться вычисленный результат для диссертации, и я не хочу связываться с несколькими запущенными потоками.Работает для MSTest. Преимущество в том, что моему коду не нужно проверять саму среду тестирования, и если мне действительно нужно асинхронное поведение в определенном тесте, я могу установить свой собственный SynchronizationContext.
Имейте в виду, что это не надежный метод
Determine if code is running as part of a unit test
в соответствии с запросом OP, поскольку код может выполняться внутри потока, но для определенных сценариев это может быть хорошим решением (также: если я уже работаю из фонового потока, это может быть необязательно начать новую).источник
Application.Current имеет значение NULL при работе под модулем тестера. По крайней мере, для моего приложения WPF с использованием тестера MS Unit. При необходимости это легко сделать. Кроме того, о чем следует помнить при использовании Application.Current в вашем коде.
источник
Я использовал следующее в VB в своем коде, чтобы проверить, действуем ли мы в модульном тесте. в частности, я не хотел, чтобы тест открывал Word
источник
Как насчет использования отражения и чего-то вроде этого:
var underTest = Assembly.GetCallingAssembly ()! = typeof (MainForm) .Assembly;
Вызывающая сборка будет там, где находятся ваши тестовые примеры, и просто замените MainForm некоторым типом, который в вашем тестируемом коде.
источник
Когда вы тестируете класс, есть действительно простое решение ...
Просто дайте классу, который вы тестируете, такое свойство:
Теперь ваш модульный тест может установить для логического значения thisIsUnitTest значение true, поэтому в коде, который вы хотите пропустить, добавьте:
Это проще и быстрее, чем осматривать сборки. Напоминает мне Ruby On Rails, где вы бы посмотрели, находитесь ли вы в среде TEST.
источник