我正在使用NUnit和 Resharper作为测试运行器为我的应用程序编写一些测试。我有一个测试,它使用自定义数据访问层在SQL中创建条目,然后检查它们是否实际上已创建。使用SqlDataAdapter使用更直接的连接完成此检查。
收集测试结果后,测试条目将从表中删除(在测试方法中,而不是在TearDown()中)。我注意到我经常因为各种原因在中间停止测试,他们显然没有得到清理,因为我告诉测试要停止,因此它永远不会达到清理代码。根据我的经验,即使TearDown()在使用停止按钮停止测试时也不会被调用。
我的问题是:当我点击停止按钮时,有没有办法调用清除程序来删除测试工件?
答案 0 :(得分:0)
如果你停止代码执行,你也会停止程序,所以不会执行任何其他操作。
您可以执行的操作是删除Set Up
。在每次测试之前执行此方法。这似乎是确保数据库干净的最佳方式。
SetUpAttribute(NUnit 2.0)
此属性在TestFixture内部使用,以提供在调用每个测试方法之前执行的一组通用函数。 TestFixture只能有一个SetUp方法。如果定义了多个,则TestFixture将成功编译,但其测试将不会运行。
<强>示例强>
namespace NUnit.Tests
{
using System;
using NUnit.Framework;
[TestFixture]
public class SuccessTests
{
[SetUp] public void Init()
{ /* ... */ }
[TearDown] public void Dispose()
{ /* ... */ }
[Test] public void Add()
{ /* ... */ }
}
}
答案 1 :(得分:0)
如果你的测试与数据库连接,它们实际上不是一个“单元”测试,而是更多的集成测试。单元测试的执行不应影响应用程序中的任何其他层。
我建议你使用“依赖注入”机制。简而言之,构建自定义数据访问层,以便在初始化时将SQL连接对象传递给它。从您的应用程序,您传递实际连接,但从您的单元测试传递模拟连接。然后,如果执行了查询或非查询,则可以断言模拟连接。
这样,您的数据库中根本不会插入任何数据,如果您的测试在执行过程中停止,则无需担心清理它。
您可以在这篇文章中查看模拟SQL连接的示例:Mocking data access Layer Rhino mock