如果可能,我会避免外部化跳过测试(例如配置/命令文件)。这在使测试易于运行和可靠方面有所不利。当其他人开始参与时,忽略代码中的测试是最安全的方法。
我可以看到许多选项,以下是两个涉及修改现有代码的选项。
选项1-最深入的——编译时平台检测
在VS解决方案中,定义另一个配置,它定义了一个预编译器标记MONOWIN
(只是为了明确地指出它是用于在Mono上使用的Windows上编译的代码的标记)。
然后定义一个属性,使得在编译为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";
}
}
public static bool IsRunningOnMono() {
return Type.GetType("Mono.Runtime") != null;
}
}
注意1
如果使用[Fact]
和[IgnoreOnMonoFact]
标记方法,则xUnit运行器会将该方法运行两次(在这种情况下,CodeRush不会这样做,我认为xUnit是正确的)。这意味着任何测试方法必须用[IgnoreOnMonoFact]
替换[Fact]
。
注意2
CodeRush测试运行器仍然运行了[IgnoreOnMonoFact]
测试,但它忽略了[Fact(Skip="reason")]
测试。我认为这是由于CodeRush反映了xUnit,而不是实际上使用xUnit库来运行它。这在xUnit运行器中可以正常工作。
[Theory(Skip = "reason")]
。 - user2051770[Theory]
内是否有一种不使用其他包就可以跳过单个测试的方法吗? - Nomnom