2012-03-23 46 views
4

我有一個使用NHibernate的.NET項目。由於某些項目要求,非常特定的代碼段使用HQL通過「按newid()排序」來選擇隨機記錄。但是,爲了單元測試的目的,我使用了內存中的SQLite數據庫,這當然會對newid()產生影響。我只需要從單元測試運行時,需要使用此替代SQLite兼容查詢。我不能僅爲單元測試目的添加條件編譯常量,而#define只能在文件級別工作,所以我不能簡單地在那裏添加常量。使用不同的SQL命令進行單元測試的最佳方式是什麼?

我真的不想爲了啓用這個單元測試而使用一些垃圾代碼來清理我的存儲庫類。我有什麼選擇?

編輯:

我已經有其他的東西,一個全球性的課,所以我增加了一個靜態的測試模式屬性,這將是假的比我明確地將其設置爲我的單元測試以外的任何時間,因此代碼現在看起來像:

string random, update; 
if (Globals.TestMode) 
{ 
    random = "from Customer order by random()"; 
} 
else 
{ 
    random = "from Customer order by newid()"; 
} 

這樣的工作,但我希望避免確切的這樣的if語句。仍在尋找建議。

+0

你是單元測試隨機記錄的選擇,還是隻是你試圖單元測試的方法的依賴? – StriplingWarrior 2012-03-23 16:43:38

+0

這兩種,我想。正在測試的方法應該選擇1條隨機記錄,並使用該記錄的信息更新單獨的表。我試圖測試(A)選擇的記錄是隨機的,(B)另一個表格包含正確的信息。 – Chris 2012-03-23 16:45:11

+0

然後,您應該已經有兩個測試:第一個測試返回一個隨機記錄的事實,第二個測試記錄正確插入數據庫的事實。 否則,如果你的測試失敗,你將不得不調試你的測試,看看究竟是什麼失敗。 – 2012-03-23 17:05:35

回答

0

您可以抽象出將HQL查詢提供給注入到存儲庫的單獨類的責任。這樣你的測試代碼就可以注入一個不同的類的實現(甚至是一個模擬的實現),它提供了你知道可以在你的SQLite服務器上工作的HQL。

請記住,這不是一個真正的單元測試,因爲您測試的不僅僅是您的代碼。爲了讓你的測試通過,你需要依靠數據庫和NHibernate提供者來工作。此外,確定性地測試所選記錄是「隨機」是不可能的。單元測試是確定性的。您正在描述一個集成測試,因爲您試圖通過ORM測試與數據庫的交互。

問題是,您正試圖使用​​不同的數據庫服務器來測試它,而不是實際在生產中使用它。這是值得懷疑的,因爲正如你所注意的那樣,即使測試通過了,你也不能保證代碼將在生產環境中真正起作用。

相關問題