2010-08-16 32 views
5

回答:我沒有清除ConnectionPools。單元測試後無法刪除數據庫

的解決方案是:

設置:看

  1. 檢查是否 'TEMP_NUnit' 數據庫(SQL Server 2005)上的本地實例存在
  2. 如果它存在,刪除它。
  3. 創建一個名爲'TEMP_NUnit'的新空白數據庫。

測試:

  1. 實例化 '升級數據庫' 組件。
  2. 檢查組件的基本屬性是否正確默認。
  3. 點在空白數據庫組件和調用。升級()
  4. 檢查升級實際工作

TearDown中:

  1. SqlConnection.ClearAllPools();
  2. 降 'TEMP_NUnit' 數據庫。

原始問題在下面。


大家好

測試場景是:

設置:看

  1. 檢查是否 'TEMP_NUnit' 數據庫(SQL Server 2005)的本地實例
  2. 存在
  3. 如果存在,請將其放下。
  4. 創建一個名爲'TEMP_NUnit'的新空白數據庫。

測試:

  1. 實例化 '升級數據庫' 組件。
  2. 檢查組件的基本屬性是否正確默認。
  3. 點在空白數據庫組件和調用。升級()
  4. 檢查升級實際工作

TearDown中:

  1. 降 'TEMP_NUnit' 數據庫。

一切都很好,直到我到了TearDown階段。我總是得到以下錯誤:

Cannot drop database "TEMP_NUnit" because it is currently in use.

這是混淆了我,因爲我關閉(顯式調用conn.Close在最後陳述)和處理(通過使用語句)我所有的DbConnection正確的對象。 TearDown出現時應該不會在「TEMP_NUnit」數據庫上運行任何內容。

如果我關閉NUnit,然後重新打開它,SetUp的第2步總是先工作。

我不知道我在做什麼錯在這裏。任何指針正確的方向將不勝感激。

回答

5

啊,但你忘了刪除數據庫之前做這件小事:

SqlConnection.ClearAllPools(); 

默認情況下,連接池將保持到數據庫的連接,即使你之前關閉它。做SqlConnection.ClearAllPools()實際上會強制關閉所有連接。然後,您可以連接到master並刪除臨時數據庫。

它引起了我的悲傷相當量前:)

+0

賓果!謝啦。 – 2010-08-16 03:57:29

0

可能要考慮Michael Feathers Unit Testing Rules

測試是不是一個單元測試,如果:

  • 它談論到數據庫
  • 它通過網絡進行通信
  • 它觸及文件系統
  • 它不能與任何其他單元測試同時運行
  • 您必須對環境執行特殊的操作(例如編輯配置文件)才能運行它。
+1

非常好的鏈接。我仍然會寫這個測試,因爲我需要這樣的東西,可以快速檢查升級代碼是否適用於各種場景。然而,二元砍的想法是一個很好的想法。我將把這個測試分成它自己的dll。 Thanaks。 – 2010-08-16 03:55:44

+1

請注意,上述文章也同意「我們需要這兩種測試,但這些」純粹的「單元測試被低估了。」因此,與數據庫交談的(非單元)測試很好,真的。 – 2013-08-07 06:38:39