gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:57:03 24 4
gpt4 key购买 nike

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

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

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

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

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

问题:根据MSDN “[o] 一个类中只有一个方法可以用 [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# - 每个测试类的多个 ClassCleanup 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36780285/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com