基于单元测试的类中的ClassInitialize属性未调用

我在TestBase类中添加了这些方法:

[ClassInitialize]
public static void InitializBeforeAllTests()
{
}

但是当我在Debug中运行单元测试Test1()时:

[TestClass]
public class TestMapping : TestBase
{
    [TestMethod]
    public void Test1()
    {
    }

永远不会调用3007582617320555555520方法。为什么?

Phil asked 2020-08-12T03:40:07Z
5个解决方案
13 votes

在方法上声明ClassInitialize属性时,该方法必须是静态的,公共的,无效的,并且应采用TestContext类型的单个参数。

如果在同一单元测试中还具有AssemblyInitialize属性的其他方法,则该测试将运行,但将跳过所有测试方法,并将直接转到AssemblyCleanup或退出。

尝试在MSDN中的ClassInitialize属性上的示例。

Shaulian answered 2020-08-12T03:40:21Z
8 votes

无论出于何种原因,单元测试框架的UnitTestExecuter都只能为每个测试类定义一个ClassInitialize和一个ClassCleanup方法...与TestInitialize和TestCleanup方法不同,后者在派生和基本测试类中都被调用...

Paul Killick answered 2020-08-12T03:40:42Z
7 votes

您可以在基类中设置程序集的初始化方法。 与ClassInitialize不太一样,但这是一个可行的选择。 来源:此处提到的解决方法。

[TestClass]
public abstract class TestBase
{
    [AssemblyInitializeAttribute]
    public static void Initialize(TestContext context)
    {
        // put your initialize code here
    }
}

您还可以添加清除方法:

[AssemblyCleanup]
public static void Cleanup()
{
   //clean up stuff here
}
James Lawruk answered 2020-08-12T03:41:06Z
0 votes

MS链接不再起作用。无论如何,解决此问题的一种方法是将初始化代码简单地移到基类的构造函数中。 这将确保在实例化任何后代类时从任何后代类中调用它。

[TestClass]
public class TestBase
{
    public TestBase()
    {
        // Initialization Code
    }
}

[TestClass]
public class TestMapping : TestBase
{
    [TestMethod]
    public void Test1()
    {
        // At this point the base constructor should have been called
    }
}
Vince Iovacchini answered 2020-08-12T03:41:27Z
0 votes

就我而言,我应用了[AssemblyCleanup]属性(测试是手动运行的)
这导致[Ignore]永远不会被调用

如果删除[AssemblyCleanup]属性,将按预期方式调用[Ignore]

奇怪的是,无论是否将[Ignore]应用于我的测试,仍然会调用[AssemblyCleanup]

Branden Barber answered 2020-08-12T03:42:00Z
translate from https://stackoverflow.com:/questions/7322154/classinitialize-attribute-in-unit-test-based-class-not-called