Qua*_*yst 5 c# inheritance integration-testing mstest
情况:我的一些集成测试类共享在数据库中设置场景的通用方法,因此我提供了一个抽象基类。在所有测试运行结束后,它还会负责完整的数据清理:
public abstract class IntegrationTests
{
...
protected static void Cleanup() { ... }
}
Run Code Online (Sandbox Code Playgroud)
我的继承类需要调用基本方法以确保我的基本清理代码运行:
[TestClass]
public class FooIntegrationTests : IntegrationTests
{
...
[ClassCleanup]
public static void FooCleanup()
{
...
Cleanup();
}
}
Run Code Online (Sandbox Code Playgroud)
问题:根据MSDN,“类中只有一个方法可以用 [ClassCleanup] 属性装饰”,因此我无法Cleanup从基类装饰该方法,即使我这样做了,该方法也不会被调用。
问题:我想要一个解决方案
Cleanup始终从基类运行该方法,而不在继承的类中实现任何内容,并且我不喜欢强制继承测试类显式调用基类,因为我必须记住实现它。我更喜欢一种更优雅但简单(!)的技术。有任何想法吗?
注意:为我的基本功能提供一个由所有测试类共享的单例是行不通的,因为我在多个测试代理上并行运行测试,所有测试代理都连接到同一个数据库实例。
根据我从评论中的回答,调用 ClassCleanup 不再起作用。
我在工作中一直这样做。您所要做的就是将基类也固定为测试类,并在那里“使用”您的清理和拆卸属性。如果您需要在派生类中进行清理/拆卸,只需创建一个虚拟方法,您可以在需要时对其进行 ovveride:
[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() { }
}
Run Code Online (Sandbox Code Playgroud)
使用此构造,您在集成测试中所需要做的就是重写 BaseTestCleanup() ,如下所示:
[TestClass]
public class DerivedTestClass : BaseIngetrationTest
{
public override void BaseTestCleanup()
{
// Derived cleanup
base.BaseTestCleanup();
}
[TestMethod]
public void SomeMethod_SomeCriteria_SomeResult()
{
// Arrange
// Act
// Assert
}
}
Run Code Online (Sandbox Code Playgroud)