2010-10-26 100 views
5

這可能已經問了很多次,但這裏有雲:如何單元測試數據庫類

我有一類完全DB連接

開放連接
查詢數據庫
讀值
收盤連接

我應該如何測試這個東西?

我是否需要創建一個假數據庫? 我想我可以模擬MySql類(用於C#),但這也是很多工作。

一些陳述是「INSERT INTO」,我應該怎麼做呢?

+3

如果您認爲某個問題可能已經被詢問bofore,您應該[搜索它](http://stackoverflow.com/search?q=unit+test+database+class)。 – meagar 2010-10-26 20:38:12

回答

7

難以測試的東西通常是tightly coupled或不在Single Responsibility principle之後。

首先。拆分你的數據層。看看repository pattern。每個實體(表或視圖)應該有它自己的類獲取數據。

使用數據接口而不是特定的驅動程序實現:IDbConnection而不是SqlConnection。使用DbProviderFactory來獲得正確的連接實現。然後使用connection.CreateCommand()來獲取命令等。

這樣做會使測試數據層變得容易很多。請記住,datalyer不應該有任何邏輯。它的唯一目的是從數據源加載數據。

但是,如果你不想改變的東西:對數據庫的工作是最簡單的方法。刪除所有數據並在每次測試之前插入新的測試數據(以刪除先前測試期間的任何更改)。

+0

好,但要小心這些單元測試是否並行運行 - 在這一點上,第二次測試將擦除第一次測試所需的數據。如果測試框架發生了變化,或者新版本更改了測試執行順序,則會發生這種情況。我最近調試了這個確切的問題。 – 2011-11-21 11:27:24

2

最簡單的做法是創建一個新的測試數據庫並製作一些插入查詢,然後將結果集存儲在一個列表或其他東西中,然後使用調試器運行它,以查看它是否將結果集存儲在列表中創建。

不要在源代碼中插入任何插入內容,請使用sql管理工作室並在其中插入內容,直到您知道連接和一切正常。現在就列出所有這些值。

0

您可以使用在本機上運行的實時MySql數據庫。

我已經做了NuGet包用於此目的,可以添加到您的項目:https://github.com/stumpdk/MySql.Server

它每次運行測試時啓動一個本地MySQL服務器。它很快,爲您的團隊提供了可共享的解決方案,而且您不必花費時間安裝服務器。