我会避免外部化跳过测试(即,如果可能的话,一个配置/命令文件)。这在某种程度上不利于使测试易于运行和值得信赖。当其他人开始参与时,在代码中忽略测试是最安全的方法。
我可以看到许多选项,这里有两个涉及修改现有代码。
选项 1 - 最具侵入性的编译时平台检测
在 VS 解决方案中,定义另一个定义预编译器标志的配置MONOWIN
(只是为了明确表示它是用于在 Windows 上编译以在 Mono 上使用的代码的标志)。
然后定义一个属性,在为 Mono 编译时将忽略该测试:
public class IgnoreOnMonoFactAttribute : FactAttribute {
#if MONOWIN
public IgnoreOnMonoFactAttribute() {
Skip = "Ignored on Mono";
}
#endif
}
实际上很难找到这种方法的任何优势,因为它涉及使用原始解决方案进行模拟并添加另一个需要支持的确认。
选项 2 - 有点侵入性 - 运行时平台检测
这是与 option1 类似的解决方案,但不需要单独配置:
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
如果用[Fact]
和标记,xUnit runner 将运行一个方法两次[IgnoreOnMonoFact]
。(CodeRush 不这样做,在这种情况下,我假设 xUnit 是正确的)。这意味着任何测试方法都必须[Fact]
替换为[IgnoreOnMonoFact]
笔记2
CodeRush 测试运行程序仍然运行[IgnoreOnMonoFact]
测试,但它确实忽略了[Fact(Skip="reason")]
测试。我认为这是由于 CodeRush 反映了 xUnit 而不是在 xUnit 库的帮助下实际运行它。这适用于 xUnit 跑步者。