使MSTest尊重[Conditional()]属性?

时间:2010-06-28 16:00:22

标签: c# mstest

我正在使用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 个答案:

答案 0 :(得分:6)

ConditionalAttribute不会影响方法是否编译到应用程序中。它控制是否将对方法的调用编译到应用程序中。

此示例中没有调用EnsureVerboseLog。 MSTest只是在assemlby中看到一个带有TestMethod属性的方法并正确执行它。为了防止MSTest运行该方法,您需要执行以下操作之一

  1. 不将其编译到您的应用程序中(可能通过#if's)
  2. 不使用TestMethod属性
  3. 注释它

答案 1 :(得分:5)

  

那么,有没有办法根据编译排除某些测试   常数除了#if

为什么忽略明显的?它的可读性,完全是想要的工作等等......

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

HTH ..

答案 2 :(得分:1)

解决方法是将Priority属性设置为-1到您的方法。然后使用“minpriority:0”作为参数运行mstest

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