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

时间:2011-09-06 15:13:20

标签: c# vs-unit-testing-framework

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

[ClassInitialize]
public static void InitializBeforeAllTests()
{
}

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

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

永远不会调用TestBase.InitializBeforeAllTests()方法。 为什么呢?

6 个答案:

答案 0 :(得分:12)

在方法上声明ClassInitialize属性时,该方法必须是static,public,void ,并且应该采用TestContext类型的单个参数

如果您在同一个单元测试中使用了AssemblyInitialize属性的其他方法,则测试将会运行,但会跳过所有测试方法并直接转到AssemblyCleanup或者只是退出。

尝试ClassInitialize attribute in MSDN上的示例。

答案 1 :(得分:8)

无论出于何种原因,单元测试框架的UnitTestExecuter只允许为每个测试类定义一个ClassInitialize和一个ClassCleanup方法......不像TestInitialize和TestCleanup方法,它们在派生和基础测试类中都被调用... < / p>

答案 2 :(得分:7)

您可以在基类中设置程序集初始化方法。与ClassInitialize不完全相同,但它是一个可行的选择。来源:The Workaround mentioned here.

[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
}

答案 3 :(得分:2)

我知道这是一个非常古老的问题,但它是第一个在寻找类似问题时在谷歌搜索中弹出的问题,无论如何,这里是答案的更新:

 [ClassInitialize(InheritanceBehavior.BeforeEachDerivedClass)]
 public static void YOUR_INIT_METHOD_NAME(TestContext context)

注意:您需要 MSTest.TestFramework-Version 2.0.0 包或更新的包才能工作。

答案 4 :(得分:1)

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
    }
}

答案 5 :(得分:0)

就我而言,我应用了[Ignore]属性(测试是手动运行的)
这导致[AssemblyInitialize]从未被呼叫

如果我删除了[Ignore]属性[AssemblyInitialize],将按预期方式调用。

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