Определите, работает ли код как часть модульного теста

У меня есть модульный тест (nUnit). Много слоев вниз стек вызовов, который приведет к сбою метод, если он будет работать через модульный тест.

Идеально Вы использовали бы что-то как насмешка для установки объекта, в зависимости от которого этот метод, но это - сторонний код, и я не могу сделать этого без большой работы.

Я не хочу установку nUnit определенные методы - существует слишком много уровней здесь, и это - плохой способ сделать модульный тест.

Вместо этого то, что я хотел бы сделать, должно добавить что-то вроде этого в глубине души в стеке вызовов

#IF DEBUG // Unit tests only included in debug build
if (IsRunningInUnitTest)
   {
   // Do some setup to avoid error
   }
#endif

Так какие-либо идеи о том, как записать IsRunningInUnitTest?

P.S. Я полностью осведомлен, что это не большой дизайн, но я думаю лучше, чем альтернативы.

96
задан Ryan 2 July 2010 в 16:52
поделиться

3 ответа

Я делал это раньше - мне приходилось зажимать нос, пока я это делал, но я сделал это. Прагматизм всегда побеждает догматизм. Конечно, если есть , вы можете провести рефакторинг, чтобы избежать этого, это было бы здорово.

В основном у меня был класс «UnitTestDetector», который проверял, загружена ли сборка фреймворка NUnit в текущий домен приложения. Это нужно было сделать только один раз, а затем кешировать результат. Уродливо, но просто и эффективно.

73
ответ дан 24 November 2019 в 05:33
поделиться

Взяв идею Джона, это то, что я придумал -

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; }
    }
}

В конце концов, мы все достаточно большие мальчики, чтобы распознать, когда мы делаем то, чего, вероятно, не должны; )

72
ответ дан 24 November 2019 в 05:33
поделиться

Адаптировано из ответа Райана. Это для среды модульного тестирования 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
    }
54
ответ дан 24 November 2019 в 05:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: