单元测试插入/更新/删除

时间:2010-03-18 19:52:38

标签: c# asp.net sql-server linq unit-testing

我用谷歌搜索了一下,并没有找到我需要的答案。

我正在使用SQL Server和LINQ为客户开发C#的网页。 我希望用户能够相互发送消息。所以我所做的就是用实际进入数据库的数据对其进行单元测试。

问题是我现在依赖至少有2个用户,我知道他的ID。此外,我必须自我清理。这导致了相当大的单元测试,在一次测试中进行了很多测试。

假设我想更新用户。这意味着我必须终止用户,更新它,然后删除它。这在一个单元测试中有很多断言,如果失败并且有更新,我必须手动删除它。

如果我以任何其他方式执行此操作,而不将数据保存到数据库,我肯定无法在更新等后知道数据存在于数据库中。

如果没有在一次测试中测试大量功能的测试,那么正确的方法是什么?

3 个答案:

答案 0 :(得分:17)

在System.Transactions.TransactionScope块中进行所有测试,并且不要调用Scope.Complete()...当您退出时,所有更改都将回滚,其他用户将无法看到您在数据库中创建的临时数据,因此测试过程只会影响测试机器。

您可以在TransactionScope的块内输入新用户,读取数据库以验证输入是否正确,以及您需要检查的其他内容......

让单个单元测试方法模拟两个不同的用户,所有这些都在一个事务中......

e.g。代码

   using (var scop = new System.Transactions.TransactionScope())
   {
       // all your test code and Asserts that access the database, 
       // writes and reads, from any class, ...
       // to commit at the very end of this block,
       // you would call
       // scop.Complete();  // ..... but don't and all will be rolled back
   }

答案 1 :(得分:4)

拥有一个fixtures文件(XML,SQL,YAML等),只需一个命令即可加载到本地测试数据库中。

E.g。需要互相发送消息的两个用户的fixtures文件可能看起来像(这是我的):

Member:

  Member_WibWobble:
    username:       Wibble_Wobble
    email_address:  michael+dev_wibwob@[removed].com
    password:       pw
    is_super_admin: true
    last_login:     "2010-01-06 12:12:57"
    Country:        country_AU
    UploadImage:
      type:         <?php echo UploadImage::TYPE_MEMBER_AVATAR."\n"; ?>
      upload:       "http://localhost/[removed]/images/wibwobble.jpg"

  Member_BunnyHugs:
    username:       BunnyHugs
    email_address:  michael+dev_bunny@[removed].com
    password:       pw
    is_super_admin: true
    last_login:     "2009-12-01 14:11:11"
    Country:        country_UK
    UploadImage:
      type:         <?php echo UploadImage::TYPE_MEMBER_AVATAR."\n"; ?>
      upload:       "http://localhost/[removed]/images/bunnyhugs.jpg"

PrivateMessage:

  PrivateMessage_1:
    subject:          "Yo"
    body:         |
      hi

      <b>escape this html please</b>

      bye
    is_read:          false
    Sender:           Member_WibWobble
    Recipient:        Member_BunnyHugs

答案 2 :(得分:4)

单元测试数据库可以是PITA,因为它们的本质(持久存储)。

要做到这一点,您应该始终使用空白架构。然后让您的测试代码加载填写必须存在的数据值。这可以像执行包含架构和默认数据的sql脚本一样简单。

完成后,开始运行测试。测试应包含您的应用通常会执行的所有操作。

如果发生任何失败,这并不是什么大不了的事,因为再次,你应该每次都重新开始。

此外,您希望在测试失败的情况下保留这些数据,以便您可以在发生故障时检查数据库状态。所以,这既是好事也是坏事。

沿着这些方向,db测试应该在它自己的测试数据库实例上运行。这样您就不必担心暂时性问题,例如在测试进行过程中有人在您下面更改数据库结构。

最终,数据库测试本身就是一个项目。