gpt4 book ai didi

c# - 如何确保总是在测试后执行数据库清理?

转载 作者:IT王子 更新时间:2023-10-29 04:52:56 26 4
gpt4 key购买 nike

考虑以下单元测试示例。这些评论几乎可以解释我的问题。

[TestMethod]
public void MyTestMethod()
{

//generate some objects in the database
...

//make an assert that fails sometimes (for example purposes, this fails always)
Assert.IsTrue(false);

//TODO: how do we clean up the data generated in the database now that the test has ended here?

}

最佳答案

有两种方法可以做到这一点。 One在测试类的方法上使用 TestInitialize 和 TestCleanup 属性。它们将始终分别在测试之前和之后运行。

另一种方法是利用测试失败通过异常传播到测试运行器这一事实。这意味着您的测试中的 try { } finally { } block 可用于在断言失败后清理所有内容。

[TestMethod]
public void FooTest()
{
try
{
// setup some database objects
Foo foo = new Foo();
Bar bar = new Bar(foo);
Assert.Fail();
}
finally
{
// remove database objects.
}
}

try/finally 清理会变得非常困惑,因为有很多对象要清理。我的团队倾向于使用一个实现 IDisposable 的辅助类。它跟踪已创建的对象并将它们插入堆栈。当调用 Dispose 时,项目将从堆栈中弹出并从数据库中删除。

[TestMethod]
public void FooTest()
{
using (FooBarDatabaseContext context = new FooBarDatabaseContext())
{
// setup some db objects.
Foo foo = context.NewFoo();
Bar bar = context.NewBar(foo);
Assert.Fail();
} // calls dispose. deletes bar, then foo.
}

这具有将构造函数包装在方法调用中的额外好处。如果构造函数签名发生变化,我们可以轻松修改测试代码。

关于c# - 如何确保总是在测试后执行数据库清理?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9860562/

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