单元测试后无法删除数据库

时间:2010-08-16 03:17:39

标签: database connection nunit

答案:我没有清理我的ConnectionPools。

解决的方案是:

设定:

  1. 检查本地实例上是否存在“TEMP_NUnit”数据库(SQL Server 2005)
  2. 如果存在,请将其丢弃。
  3. 创建一个名为“TEMP_NUnit”的新空白数据库。
  4. 测试:

    1. 实例化“升级数据库”组件。
    2. 检查组件的基本属性是否正确默认。
    3. 将组件指向空白数据库并调用.Upgrade()
    4. 检查升级是否真正有效
    5. TearDown中:

      1. SqlConnection.ClearAllPools();
      2. 删除'TEMP_NUnit'数据库。
      3. 原始问题在首页。


        大家好

        测试场景是:

        设定:

        1. 检查本地实例上是否存在“TEMP_NUnit”数据库(SQL Server 2005)
        2. 如果存在,请将其丢弃。
        3. 创建一个名为“TEMP_NUnit”的新空白数据库。
        4. 测试:

          1. 实例化“升级数据库”组件。
          2. 检查组件的基本属性是否正确默认。
          3. 将组件指向空白数据库并调用.Upgrade()
          4. 检查升级是否真正有效
          5. TearDown中:

            1. 删除'TEMP_NUnit'数据库。
            2. 在我进入TearDown阶段之前,一切都很顺利。我总是收到以下错误:

                

              无法删除数据库“TEMP_NUnit”,因为它当前正在使用中。

              这让我感到困惑,因为我正在关闭(在finally语句中显式调用conn.Close)并正确地处理(通过using语句)我的所有DbConnection对象。在TearDown到来之前,“TEMP_NUnit”数据库中不应该有任何运行。

              如果我关闭NUnit然后重新打开它,SetUp的第2步总是先行。

              我不确定我在这里做错了什么。任何指向正确方向的人都会受到赞赏。

2 个答案:

答案 0 :(得分:5)

啊,但是在放弃数据库之前你忘了做这件小事:

SqlConnection.ClearAllPools();

默认情况下,即使您之前关闭了连接池,连接池也将保持与数据库的连接。执行SqlConnection.ClearAllPools()实际上会强制关闭所有连接。然后,您可以连接到master并删除临时数据库。

之前,它给我带来了相当多的悲伤:)。

答案 1 :(得分:0)

可能要考虑Michael Feathers Unit Testing Rules

如果出现以下情况,则测试不是单元测试:

  • 与数据库对话
  • 通过网络进行通信
  • 它触及文件系统
  • 它不能与任何其他单元测试同时运行
  • 您必须对您的环境执行特殊操作(例如编辑配置文件)才能运行它。