Я бы избегал внешнего пропуска тестов (то есть файла конфигурации / команды, если это возможно). Это несколько противоречит тому, что тесты легко выполнять и заслуживают доверия. Создание тестов, игнорируемых в коде, является самым безопасным подходом, когда другие люди начинают вмешиваться.
Я мог видеть несколько вариантов, вот два, которые включают изменение существующего кода.
Вариант 1 - Наиболее навязчивое обнаружение платформы времени компиляции
В решении VS определите другую конфигурацию, которая определяет флаг прекомпилятора MONOWIN
(просто это явно флаг, который говорит, что он предназначен для кода, скомпилированного в Windows для использования в Mono).
Затем определите атрибут, который будет игнорировать тест при компиляции для Mono:
public class IgnoreOnMonoFactAttribute : FactAttribute {
#if MONOWIN
public IgnoreOnMonoFactAttribute() {
Skip = "Ignored on Mono";
}
#endif
}
На самом деле трудно найти какие-либо преимущества для этого метода, так как он включает в себя насмешку над исходным решением и добавляет еще один конфаймент, который необходимо поддерживать.
Вариант 2 - несколько навязчивый - обнаружение платформы во время выполнения
Вот решение, аналогичное варианту 1, за исключением того, что отдельная конфигурация не требуется:
public class IgnoreOnMonoFactAttribute : FactAttribute {
public IgnoreOnMonoFactAttribute() {
if(IsRunningOnMono()) {
Skip = "Ignored on Mono";
}
}
/// <summary>
/// Determine if runtime is Mono.
/// Taken from http://stackoverflow.com/questions/721161
/// </summary>
/// <returns>True if being executed in Mono, false otherwise.</returns>
public static bool IsRunningOnMono() {
return Type.GetType("Mono.Runtime") != null;
}
}
Примечание 1
xUnit runner будет запускать метод дважды, если он помечен [Fact]
и [IgnoreOnMonoFact]
. (CodeRush не делает этого, в этом случае я предполагаю, что xUnit является правильным). Это означает, что любые методы испытаний должны заменять [Fact]
на [IgnoreOnMonoFact]
Примечание 2
Тестер CodeRush все еще выполнял тест [IgnoreOnMonoFact]
, но игнорировал тест [Fact(Skip="reason")]
. Я предполагаю, что это связано с тем, что CodeRush отражает xUnit, а не запускает его с помощью библиотек xUnit. Это отлично работает с xUnit runner.