我想用NUnit编写命中数据库的单元测试。我希望每个测试的数据库都处于一致的状态。我认为事务可以让我“撤销”每个测试,所以我到处搜索,找到了2004-05年的几篇关于这个主题的文章:
这些问题似乎可以围绕实现NUnit的自定义属性来解决,该属性内置了在每次测试执行后回滚DB操作的能力。
这很好但是..。
编辑:这并不是我想测试我的DAL,更多的是我想测试与数据库交互的代码片段。为了让这些测试是“无接触的”和可重复的,如果我可以在每次测试后重新设置数据库,那就太棒了。
此外,我想将其简化到一个目前没有测试位置的现有项目中。因此,我实际上不能为每个测试编写从头开始的数据库和数据。
发布于 2008-12-15 01:55:26
NUnit现在有一个Rollback属性,但我更喜欢用一种不同的方式。我使用TransactionScope类。有几种方法可以使用它。
[Test]
public void YourTest()
{
using (TransactionScope scope = new TransactionScope())
{
// your test code here
}
}
由于您没有告诉TransactionScope提交,它将自动回滚。即使断言失败或抛出其他异常,它也能正常工作。
另一种方法是使用SetUp创建TransactionScope,并使用TearDown对其调用Dispose。它减少了一些代码重复,但实现了相同的功能。
[TestFixture]
public class YourFixture
{
private TransactionScope scope;
[SetUp]
public void SetUp()
{
scope = new TransactionScope();
}
[TearDown]
public void TearDown()
{
scope.Dispose();
}
[Test]
public void YourTest()
{
// your test code here
}
}
这与单独测试中的using语句一样安全,因为NUnit将保证调用TearDown。
话虽如此,我确实认为命中数据库的测试并不是真正的单元测试。我仍然会编写它们,但我认为它们是集成测试。我仍然认为它们提供了价值。我经常使用它们的一个地方是测试LINQ to SQL代码。我不使用设计器。我手写了DTO和属性。大家都知道我搞错了。集成测试有助于捕获我的错误。
发布于 2008-11-26 16:07:33
我刚刚去了一个.NET用户组,演示者说他在测试设置和拆卸中使用了SQLlite,并使用了in memory选项。他不得不稍微篡改连接,并显式地销毁连接,但每次都会得到一个干净的DB。
http://houseofbilz.com/archive/2008/11/14/update-for-the-activerecord-quotmockquot-framework.aspx
发布于 2008-11-26 16:06:51
我会把这些称为集成测试,但不要紧。对于这类测试,我所做的就是在每次测试之前,让我在测试类中的设置方法清除所有感兴趣的表。我通常会手写SQL来做这件事,这样我就不会使用测试中的类。
一般来说,我的数据层依赖于ORM,因此我不会在那里编写太多的单元测试。我觉得没有必要对不是我写的代码进行单元测试。对于我添加到层中的代码,我通常使用依赖注入来抽象出到数据库的实际连接,以便在测试我的代码时,它不会触及实际的数据库。请结合模拟框架执行此操作,以获得最佳结果。
https://stackoverflow.com/questions/321180
复制相似问题