как сказать в коде, если мы работаем от testmethod теста .NET

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

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

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

5
задан fearofawhackplanet 15 March 2010 в 11:33
поделиться

5 ответов

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

Переходя к основному вопросу.

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

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

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

6
ответ дан 13 December 2019 в 22:06
поделиться

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

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

1
ответ дан 13 December 2019 в 22:06
поделиться

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

1
ответ дан 13 December 2019 в 22:06
поделиться

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

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

Например:

// 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
ответ дан 13 December 2019 в 22:06
поделиться

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

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

#if DEBUG

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

#endif

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

1
ответ дан 13 December 2019 в 22:06
поделиться
Другие вопросы по тегам:

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