У меня есть модульный тест (nUnit). Много слоев вниз стек вызовов, который приведет к сбою метод, если он будет работать через модульный тест.
Идеально Вы использовали бы что-то как насмешка для установки объекта, в зависимости от которого этот метод, но это - сторонний код, и я не могу сделать этого без большой работы.
Я не хочу установку nUnit определенные методы - существует слишком много уровней здесь, и это - плохой способ сделать модульный тест.
Вместо этого то, что я хотел бы сделать, должно добавить что-то вроде этого в глубине души в стеке вызовов
#IF DEBUG // Unit tests only included in debug build
if (IsRunningInUnitTest)
{
// Do some setup to avoid error
}
#endif
Так какие-либо идеи о том, как записать IsRunningInUnitTest?
P.S. Я полностью осведомлен, что это не большой дизайн, но я думаю лучше, чем альтернативы.
Я делал это раньше - мне приходилось зажимать нос, пока я это делал, но я сделал это. Прагматизм всегда побеждает догматизм. Конечно, если есть , вы можете провести рефакторинг, чтобы избежать этого, это было бы здорово.
В основном у меня был класс «UnitTestDetector», который проверял, загружена ли сборка фреймворка NUnit в текущий домен приложения. Это нужно было сделать только один раз, а затем кешировать результат. Уродливо, но просто и эффективно.
Взяв идею Джона, это то, что я придумал -
using System;
using System.Reflection;
/// <summary>
/// Detect if we are running as part of a nUnit unit test.
/// This is DIRTY and should only be used if absolutely necessary
/// as its usually a sign of bad design.
/// </summary>
static class UnitTestDetector
{
private static bool _runningFromNUnit = false;
static UnitTestDetector()
{
foreach (Assembly assem in AppDomain.CurrentDomain.GetAssemblies())
{
// Can't do something like this as it will load the nUnit assembly
// if (assem == typeof(NUnit.Framework.Assert))
if (assem.FullName.ToLowerInvariant().StartsWith("nunit.framework"))
{
_runningFromNUnit = true;
break;
}
}
}
public static bool IsRunningFromNUnit
{
get { return _runningFromNUnit; }
}
}
В конце концов, мы все достаточно большие мальчики, чтобы распознать, когда мы делаем то, чего, вероятно, не должны; )
Адаптировано из ответа Райана. Это для среды модульного тестирования MS.
Причина, по которой мне это нужно, заключается в том, что я показываю MessageBox при ошибках. Но мои модульные тесты также проверяют код обработки ошибок, и я не хочу, чтобы MessageBox появлялся при запуске модульных тестов.
/// <summary>
/// Detects if we are running inside a unit test.
/// </summary>
public static class UnitTestDetector
{
static UnitTestDetector()
{
string testAssemblyName = "Microsoft.VisualStudio.QualityTools.UnitTestFramework";
UnitTestDetector.IsInUnitTest = AppDomain.CurrentDomain.GetAssemblies()
.Any(a => a.FullName.StartsWith(testAssemblyName));
}
public static bool IsInUnitTest { get; private set; }
}
А вот модульный тест для него:
[TestMethod]
public void IsInUnitTest()
{
Assert.IsTrue(UnitTestDetector.IsInUnitTest,
"Should detect that we are running inside a unit test."); // lol
}