为什么一个被ClassInitialize修饰的方法会导致我所有的测试失败?

8

我从MSDN了解到,ClassInitialize是用来标记一个方法,在所有测试运行之前,执行一次所有测试的设置代码。当我在下面的简化夹具中包含这样一个方法时,所有测试都失败了。只要我将它注释掉,它们就能再次通过。

[TestClass]
public class AuthenticationTests
{
    [ClassInitialize]
    public void SetupAuth()
    {
        var x = 0;
    }

    [TestMethod]
    public void TestRegisterMemberInit()
    {
        Assert.IsTrue(true);
    }
}

3
这个测试失败的原因是什么? - Jon Skeet
1
哎呀,测试窗口的错误文本部分被“最小化”到了底部。我真的不知道它在那里。谢谢Jon,你让我四处寻找,最终找到了它。 - ProfK
3个回答

19

[ClassInitialize]修饰的方法应该是静态的,并且只接受一个类型为TestContext的参数:

[ClassInitialize]
public static void SetupAuth(TestContext context)
{
    var x = 0;
}

事实上,如果我将您的代码复制并粘贴到一个干净的VS项目中,测试运行程序会在错误消息中明确解释:

方法UnitTestProject1.AuthenticationTests.SetupAuth的签名不正确。该方法必须是static、public,不返回任何值,并且应该接受一个类型为TestContext的单一参数。


感谢您。正如我在评论中解释的那样,测试运行程序中的错误被隐藏了,即它显示的面板对我来说太小了,无法看到。 - ProfK

2

带有[ClassInitialize]标记的方法:

  1. 仅适用于测试类中的一个方法。
  2. 该类必须是密封的,即不能被继承。
  3. 该方法必须是公共静态的。
  4. 该方法必须传递一个TestContext参数。
  5. 该方法不返回任何值。

0
在VS2015中,如果没有TestContext参数,则在运行测试时会输出此最无用的错误(如果有人像我一样搜索异常)。

异常抛出:'Microsoft.VisualStudio.TestPlatform.MSTestFramework.TypeInspectionException' in Microsoft.VisualStudio.TestPlatform.Extensions.VSTestIntegration.dll


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接