首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用NUnit测试与数据库相关的代码?

如何使用NUnit测试与数据库相关的代码?
EN

Stack Overflow用户
提问于 2008-11-26 15:51:02
回答 6查看 28.4K关注 0票数 65

我想用NUnit编写命中数据库的单元测试。我希望每个测试的数据库都处于一致的状态。我认为事务可以让我“撤销”每个测试,所以我到处搜索,找到了2004-05年的几篇关于这个主题的文章:

这些问题似乎可以围绕实现NUnit的自定义属性来解决,该属性内置了在每次测试执行后回滚DB操作的能力。

这很好但是..。

  1. 此功能在NUnit NUnit中是否存在此技术在过去4年中得到了改进?
  2. 这仍然是测试数据库相关代码的最佳方法吗?

编辑:这并不是我想测试我的DAL,更多的是我想测试与数据库交互的代码片段。为了让这些测试是“无接触的”和可重复的,如果我可以在每次测试后重新设置数据库,那就太棒了。

此外,我想将其简化到一个目前没有测试位置的现有项目中。因此,我实际上不能为每个测试编写从头开始的数据库和数据。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2008-12-15 01:55:26

NUnit现在有一个Rollback属性,但我更喜欢用一种不同的方式。我使用TransactionScope类。有几种方法可以使用它。

代码语言:javascript
复制
[Test]
public void YourTest() 
{
    using (TransactionScope scope = new TransactionScope())
    {
        // your test code here
    }
}

由于您没有告诉TransactionScope提交,它将自动回滚。即使断言失败或抛出其他异常,它也能正常工作。

另一种方法是使用SetUp创建TransactionScope,并使用TearDown对其调用Dispose。它减少了一些代码重复,但实现了相同的功能。

代码语言:javascript
复制
[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和属性。大家都知道我搞错了。集成测试有助于捕获我的错误。

票数 79
EN

Stack Overflow用户

发布于 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

票数 3
EN

Stack Overflow用户

发布于 2008-11-26 16:06:51

我会把这些称为集成测试,但不要紧。对于这类测试,我所做的就是在每次测试之前,让我在测试类中的设置方法清除所有感兴趣的表。我通常会手写SQL来做这件事,这样我就不会使用测试中的类。

一般来说,我的数据层依赖于ORM,因此我不会在那里编写太多的单元测试。我觉得没有必要对不是我写的代码进行单元测试。对于我添加到层中的代码,我通常使用依赖注入来抽象出到数据库的实际连接,以便在测试我的代码时,它不会触及实际的数据库。请结合模拟框架执行此操作,以获得最佳结果。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/321180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档