【问题标题】:Cannot Drop Database after Unit Test单元测试后无法删除数据库
【发布时间】:2024-01-21 22:06:01
【问题描述】:

回答:我没有清除我的 ConnectionPools。

解决的场景是:

设置:

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

测试:

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

拆解:

  1. SqlConnection.ClearAllPools();
  2. 删除“TEMP_NUnit”数据库。

原始问题在首屏下方。


大家好

测试场景是:

设置:

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

测试:

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

拆解:

  1. 删除“TEMP_NUnit”数据库。

在我进入 TearDown 阶段之前一切正常。我总是收到以下错误:

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

这让我很困惑,因为我正在关闭(在 finally 语句中显式调用 conn.Close)并正确处理(通过 using 语句)我的所有 DbConnection 对象。到 TearDown 出现时,“TEMP_NUnit”数据库上应该没有任何东西在运行。

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

我不确定我在这里做错了什么。任何指向正确方向的指针都将不胜感激。

【问题讨论】:

    标签: database connection nunit


    【解决方案1】:

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

    SqlConnection.ClearAllPools();
    

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

    之前给我带来了相当多的悲痛:)

    【讨论】:

      【解决方案2】:

      不妨考虑Michael Feathers Unit Testing Rules

      如果满足以下条件,则测试不是单元测试:

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

      【讨论】:

      • 很好的链接。我仍然会编写这个测试,因为我需要这样的东西来快速检查升级代码是否适用于各种场景。然而,二元斩的想法是一个很好的想法。我将把这个测试分离到它自己的 dll 中。坦纳克斯。
      • 请注意,上面的文章也同意“我们需要两种测试,但这些“纯”单元测试被低估了。”因此,与数据库对话的(非单元)测试真的很好。