Сделать MSTest уважать атрибут [Conditional ()]? - PullRequest
6 голосов
/ 28 июня 2010

Я использую VS2010, у меня есть следующий вызов метода:

[Conditional("DEBUG")]
public void VerboseLogging() { }

public void DoSomething() {
    VerboseLogging();
    Foo();
    Bar();
}

Затем у меня есть модульный тест для метода DoSomething, который проверяет, что он выдает правильное ведение журнала.

[Conditional("DEBUG"), TestMethod()]
public void EnsureVerboseLog() {
    DoSomething();
    VerifyVerboseLoggingCalled(); // <-- fail in release builds since VerboseLogging() calls get eliminated.
}

Похоже, что MSTest видит только TestMethod и выполняет его (генерирует неудачный тест), хотя я пометил его Conditional("DEBUG") и скомпилировал в режиме выпуска.

Итак, есть ли способ исключить определенные тесты в зависимости от константы компиляции, отличной от #if?

Ответы [ 3 ]

7 голосов
/ 28 июня 2010

ConditionalAttribute не влияет на то, скомпилирован ли метод в приложение или нет.Он контролирует, будут ли вызовы метода компилироваться в приложение.

В этом примере нет вызова на EnsureVerboseLog.MSTest просто видит в ассемблете метод с атрибутом TestMethod и правильно его выполняет.Чтобы предотвратить запуск метода MSTest, вам необходимо выполнить одно из следующих действий:

  1. Не компилировать его в ваше приложение (возможно через # if)
  2. Не комментироватьАтрибут TestMethod
5 голосов
/ 10 марта 2015

Итак, есть ли способ исключить определенные тесты в зависимости от компиляции константа , отличная от #, если ?

Почему игнорировать очевидное? он читабелен, выполняет именно ту работу и т. д ...

[TestMethod]
#if !DEBUG
[Ignore]
#endif
public void AnyTest()
{
    // Will invoke for developer and not in test-server!
}

НТН ..

1 голос
/ 10 января 2012

Обходной путь - установить для атрибута Priority значение -1 для вашего метода. Затем запустите mstest с аргументом "minpriority: 0".

[TestMethod()]
[Priority(-1)]
public void Compute_Foo()
{
    This method will not be executed
}
...