编程语言
首页 > 编程语言> > c# – 每个测试类的多个ClassCleanup属性

c# – 每个测试类的多个ClassCleanup属性

作者:互联网

情况:我的一些集成测试类共享一种在数据库中设置场景的通用方法,因此我提供了一个抽象基类.在所有测试运行后,它还会在最后完成数据清理:

public abstract class IntegrationTests
{
    ...
    protected static void Cleanup() { ... }
}

我的继承类需要调用基本方法以确保我的基本清理代码运行:

[TestClass]
public class FooIntegrationTests : IntegrationTests
{
    ...

    [ClassCleanup]
    public static void FooCleanup()
    {
        ...
        Cleanup();
    }
}

问题:根据MSDN“[类]一个类中的一个方法可能用[ClassCleanup]属性进行修饰”所以我不能从基类中修饰Cleanup方法,即使我做了这个方法也不会被调用.

问题:我想要一个解决方案

>始终从基类运行Cleanup方法,而不在继承的类中实现任何内容,以及
>如果存在,则始终从继承测试类运行自定义清理方法.

我不喜欢强制继承测试类显式调用基类,因为我必须记住实现它.我更喜欢更优雅而简单的(!)技术.有任何想法吗?

注意:为所有测试类共享的基本功能提供单例不起作用,因为我在多个测试代理上并行运行测试,所有测试代理都连接到同一个数据库实例.

解决方法:

根据评论中的答案,调用ClassCleanup不再发挥作用.

我在工作中一直这样做.您所要做的就是将基类作为测试类固定,并在那里“花费”您的清理和拆除属性.如果您需要在派生类中进行清理/拆卸,只需创建一个虚拟方法,您可以在需要时立即执行:

[TestClass]
public abstract class BaseIntegrationTest
{
    [TestInitialize]
    public void BeforeEach() {
        // Stuff that should happen before each unit test

        BaseTestInitialize();
    }

    [TestCleanup]
    public void AfterEach(){
        // Stuff that should happen after each unit test

        BaseTestCleanup();
    }

    public virtual void BaseTestInitialize() { }
    public virtual void BaseTestCleanup() { }
}

使用此构造,您在集成测试中所要做的就是覆盖BaseTestCleanup():

[TestClass]
public class DerivedTestClass : BaseIngetrationTest
{
    public override void BaseTestCleanup()
    {
        // Derived cleanup
        base.BaseTestCleanup();
    }


    [TestMethod]
    public void SomeMethod_SomeCriteria_SomeResult()
    {
        // Arrange

        // Act

        // Assert
    }
}

标签:c,inheritance,mstest,integration-testing
来源: https://codeday.me/bug/20190711/1431170.html