Unit testing 在MSTest中使用继承

Unit testing 在MSTest中使用继承,unit-testing,visual-studio-2010,mstest,Unit Testing,Visual Studio 2010,Mstest,我正在设置一些基于MSTest的单元测试。为了让我的生活更轻松,我想使用一个基类来处理通用设置并降低所有测试所需的时间。我的基类如下所示: [TestClass] public class DBTestBase { public TestContext TestContext { get; set; } [ClassInitialize()] public static void MyClassInitialize(TestContext testContext) {

我正在设置一些基于MSTest的单元测试。为了让我的生活更轻松,我想使用一个基类来处理通用设置并降低所有测试所需的时间。我的基类如下所示:

[TestClass]
public class DBTestBase {
    public TestContext TestContext { get; set; }

    [ClassInitialize()]
    public static void MyClassInitialize(TestContext testContext) {
        var config = new XmlConfigurationSource("ARconfig_test.xml");
        ActiveRecordStarter.Initialize(Assembly.Load("LocalModels"), config);
    }

    [TestInitialize()]
    public void MyTestInitialize() {
        ActiveRecordStarter.CreateSchema();
        Before_each_test();
    }

    protected virtual void Before_each_test() { }

    [TestCleanup()]
    public void MyTestCleanup() {
        After_each_test();
    }

    protected virtual void After_each_test() { }
}
[TestClass]
public class question_tests : DBTestBase {

    private void CreateInitialData() {
        var question = new Question()
                           {
                               Name = "Test Question",
                               Description = "This is a simple test question"
                           };
        question.Create();
    }

    protected override void Before_each_test() {
        base.Before_each_test();
        CreateInitialData();
    }

    [TestMethod]
    public void test_fetching() {
        var q = Question.FindAll();
        Assert.AreEqual("Test Question", q[0].Name, "Incorrect name.");
    }
}
我的实际测试类如下所示:

[TestClass]
public class DBTestBase {
    public TestContext TestContext { get; set; }

    [ClassInitialize()]
    public static void MyClassInitialize(TestContext testContext) {
        var config = new XmlConfigurationSource("ARconfig_test.xml");
        ActiveRecordStarter.Initialize(Assembly.Load("LocalModels"), config);
    }

    [TestInitialize()]
    public void MyTestInitialize() {
        ActiveRecordStarter.CreateSchema();
        Before_each_test();
    }

    protected virtual void Before_each_test() { }

    [TestCleanup()]
    public void MyTestCleanup() {
        After_each_test();
    }

    protected virtual void After_each_test() { }
}
[TestClass]
public class question_tests : DBTestBase {

    private void CreateInitialData() {
        var question = new Question()
                           {
                               Name = "Test Question",
                               Description = "This is a simple test question"
                           };
        question.Create();
    }

    protected override void Before_each_test() {
        base.Before_each_test();
        CreateInitialData();
    }

    [TestMethod]
    public void test_fetching() {
        var q = Question.FindAll();
        Assert.AreEqual("Test Question", q[0].Name, "Incorrect name.");
    }
}
TestInitialize函数按预期工作。但是ClassInitialize函数从未运行过。如果我将以下内容添加到我的子类中,它将运行:

    [ClassInitialize()]
    public static void t(TestContext testContext) {
        MyClassInitialize(testContext);
    }

是否可以让我的基类初始化函数运行而不在我的子类中引用它?

确认这对我来说也是一个问题。当且仅当相关“类”至少包含一个TestMethod时,我在基础上使用了构造函数,并为cleanup执行了析构函数

ClassInitialize方法,并且至少从类中选择了一个TestMethod来执行。

太老练了,无法作为答案添加:尝试在基类中使用静态构造函数。我最终使用了AssemblyInitialize()。这不完全是我想要的,但我想MSTest做不到@鲁法马蒂,你的答案很可能是唯一的办法。如果你发布它,我会接受它。问题是终结器不能保证在确定的时间运行。例如,在我的测试中,我想模拟一个给定的用户,但一旦我的测试完成,就撤消模拟。这在终结器中不起作用,因为在它运行之前,很可能会运行我的许多其他测试。构造函数的问题是它的工作原理与TestInitialize相同。它将在每个测试上运行。这里没有终结器-只有TestCleanup()的使用-有很大区别。TestCleanup()的行为和执行是确定性的,并且定义良好。这是一种非常愚蠢的编码方式。TestInitialize和TestCleanup不是这样工作的…同意-但事实就是这样:-(我在代码中添加了这个:[ClassInitialize]public new static void ClassSetup(TestContext context){TestBase.ClassSetup(context);}
[TestClass]
public class question_tests : DBTestBase {
...
    [TestCleanup()]
    public void TestCleanup()
    {
        base.MyTestCleanup();
    }