Существует ли способ знать, когда код называют от выполнения метода тестирования?
bool MyMethod()
{
if ( /* are we running a test? */ )
{
return true; // otherwise this will fail from the automated build script
}
else
{
// run the proper code
}
}
и сэкономьте меня, "это - действительно плохая идея" комментарии :)
Вы понимаете, что это может быть плохой идеей, но можете не знать об альтернативах. Вам следует изучить mocking frameworks - они могут предоставить способ внедрения альтернативных реализаций в ваш код во время выполнения в ваших модульных тестах. Это устоявшаяся практика, позволяющая коду вести себя по-разному при тестировании и производстве.
Переходя к основному вопросу.
Это зависит от используемой вами среды модульного тестирования. Мне неизвестна конкретная функция в NUnit (например), которая сообщает, что вы участвуете в тесте. Другие фреймворки (например, MS Test) вполне могут предоставить это. Однако сделать это самому несложно.
Если вы привязываетесь к исходному коду, просто используйте директиву #define , чтобы условно определить некоторую переменную, по которой вы можете перейти.
Если вы привязываетесь к библиотеке, я бы порекомендовал создать свой собственный класс, который вы будете использовать для отслеживания того, находитесь ли вы в модульном тесте или в реальном коде, и настроить этот класс в настройке TestFixture. метод , чтобы указать, что вы запускаете тест. Вы также можете использовать Environment.SetEnvironmentVariable
как способ избежать написания специального класса.
Хорошо, я избавлю вас от моего комментария «это действительно плохая идея».
Вы можете просто указать методу параметр bool isTestMode
.
Атрибут вызываемых методов следует проверять путем отражения! Я не буду упоминать, что это идея кровати, потому что вы знаете это так, как я вижу;)
Подход, изложенный в вашем вопросе , является действительно плохой идеей.
Более чистый подход, если вы хотите, чтобы метод вел себя при тестировании иначе, чем в противном случае, - это рефакторинг интерфейса с методом и внедрение другой реализации во время тестирования.
Например:
// 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 */ }
}
Вот мое предложение.
Вместо проверки контекста просто добавьте условный код ошибки:
#if DEBUG
/* assume you are running in a test environment here */
#endif
Это почти не плохо. И если это не совсем то, что вам нужно, вы можете рассмотреть #define
-ing "TEST" для случаев, когда вы хотите, чтобы ваш тестовый код не выполнялся во время обычной отладки.