Ответ 1
Я бы избегал экстернализации пропущенных тестов (т.е. файла конфигурации/команды, если это возможно). Это несколько противоречит тому, чтобы тесты легко запускались и заслуживали доверия. Проведение тестов, игнорируемых в коде, является самым безопасным подходом, когда другие люди начинают участвовать.
Я мог видеть несколько вариантов, вот два, которые включают в себя модификацию существующего кода.
Вариант 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.