当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何使用NUnit测试与数据库相关的代码?》经验,为你挑选了1个好方法。

我想用NUnit编写单元测试,这些测试命中了数据库.我希望每个测试都使数据库处于一致状态.我认为交易将允许我"撤销"每个测试,所以我搜索了四周,并在2004-05上找到了几篇关于这个主题的文章:

http://weblogs.asp.net/rosherove/archive/2004/07/12/180189.aspx

http://weblogs.asp.net/rosherove/archive/2004/10/05/238201.aspx

http://davidhayden.com/blog/dave/archive/2004/07/12/365.aspx

http://haacked.com/archive/2005/12/28/11377.aspx

这些似乎解决了为NUnit实现自定义属性的问题,该属性构建为在每次测试执行后回滚数据库操作的能力.

那很好但是......

    此功能是否存在于NUnit本地?

    这项技术在过去4年中有所改进吗?

    这仍然是测试数据库相关代码的最佳方法吗?


编辑:并不是我想要专门测试我的DAL,而是我想要测试与数据库交互的代码片段.对于这些测试是"无接触"和可重复的,如果我可以在每个测试后重置数据库,那就太棒了.

此外,我想将其简化为现在没有测试位置的现有项目.出于这个原因,我无法从头开始为每个测试编写数据库和数据.



1> Mike Two..:

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和属性.我知道我弄错了.集成测试有助于发现我的错误.


@tjmoore - 只要您使用相同的连接查询数据,就可以看到行,因为您处于事务的"内部".在上面的答案中的示例代码中,您可能会调用可能会执行某些插入操作的内容,然后再查询数据并检查它是否包含预期值.一旦测试完成并且`TransactionScope`回滚,将不会留下任何东西.由于您的查询在与插入相同的事务中登记,因此将找到行.一般来说,我也嘲笑DAL,但正如你所说,有时你只需要证明插入是可行的.
使用这种方法几周后,我对它非常满意,再次感谢!
推荐阅读
小色米虫_524
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有