как сказать в коде, если мы бежим из теста .net test - PullRequest
5 голосов
/ 15 марта 2010

Есть ли способ узнать, когда код вызывается при выполнении тестового метода?

bool MyMethod()
{
    if ( /* are we running a test? */ )
    {
        return true; // otherwise this will fail from the automated build script
    }
    else
    {
        // run the proper code
    } 
}

и, пожалуйста, избавьте меня от комментариев "это действительно плохая идея":)

Ответы [ 6 ]

6 голосов
/ 15 марта 2010

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

По основному вопросу.

Это зависит от используемой вами платформы модульного тестирования. Мне неизвестна какая-либо особенность в NUnit (например), которая сообщает о вашем тесте. Другие фреймворки (такие как MS Test) вполне могут обеспечить это. Однако это легко сделать самостоятельно.

Если вы привязываетесь к исходному коду, просто используйте директиву # define , чтобы условно определить некоторую переменную, с которой вы можете переходить.

Если вы привязываетесь к библиотеке, Я бы порекомендовал создать свой собственный класс, который вы будете использовать для отслеживания того, находитесь ли вы в модульном тесте или в реальном коде, и установить этот класс в * 1023. * Метод установки TestFixture , чтобы указать, что вы запускаете тест. Вы также можете использовать Environment.SetEnvironmentVariable как способ избежать написания специального класса.

1 голос
/ 15 марта 2010

Вот мое предложение.

Вместо проверки контекста просто добавьте условный код ошибки:

#if DEBUG

/* assume you are running in a test environment here */

#endif

Это почти не плохо. И если это не совсем то, что вам нужно, вы можете заглянуть в #define -ing «TEST», когда вы можете захотеть, чтобы ваш тестовый код не выполнялся во время обычной отладки.

1 голос
/ 15 марта 2010

Подход, изложенный в вашем вопросе , является действительно плохой идеей.

Более чистым подходом, если вы хотите, чтобы тестируемый метод вел себя иначе, чем в противном случае, является рефакторинг интерфейса с методом и внедрение другой реализации во время тестирования.

например:.

// Interface whose implementation changes under testing
public interface IChangesUnderTest
{
  void DoesSomething();
}

// Inject this in production
public class ProductionCode : IChangesUnderTest
{
  void DoesSomething() { /* Does stuff */ }
}

// Inject this under test
public class TestCode : IChangesUnderTest
{
  void DoesSomething() { /* Does something else */ }
}
1 голос
/ 15 марта 2010

Вы должны проверить атрибут вызывающих методов по отражению! Я не буду упоминать, что это идея кровати, потому что вы знаете это, как я вижу;)

1 голос
/ 15 марта 2010

Хорошо, я избавлю вас от моего комментария "это * очень плохая идея".

Вы можете просто дать методу параметр bool isTestMode.

0 голосов
/ 30 июля 2018

Если вы используете тестовую среду и знаете testAssemblyName , вы можете сделать следующее:

bool IsInUnitTest = AppDomain.CurrentDomain.GetAssemblies()
            .Any(a => a.FullName.StartsWith(testAssemblyName));

Если быть более конкретным, если вы используете NUnit,

bool IsRunningFromNUnit =
           AppDomain.CurrentDomain.GetAssemblies().Any(
                a=> a.FullName.ToLowerInvariant().StartsWith("nunit.framework"));

если вы используете MSTest, тогда замените testAssemblyName на соответствующее AssemblyName , может быть Microsoft.VisualStudio.QualityTools.UnitTestFramework .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...