1

我們在項目中使用MVC,Entity Framework 4.1 Code First,SQL Server。有沒有人有使用SQLite編寫集成測試的經驗?

請分享你的經驗:你如何測試你的數據服務層?通過數據服務層,我的意思是應該由MVC控制器運行的服務,該控制器內部具有某種DbContext派生類聲明,以便它們依賴於此EF DbContext,並封裝一些業務\數據邏輯以獲取和存儲數據。

在閱讀了一些文章和文章後,我傾向於使用單獨的數據庫來構建單元/集成測試,而且我更喜歡使用內存(如SQLite)而不是SQL Compact。然而,我甚至不確定是否有可能,如果你有這樣的經驗,可以請分享幾行代碼來展示你如何實現這一目標。

回答

0

我根本不使用單獨的數據庫。實際上,我的單​​元測試根本不使用數據庫。

我的策略是爲DB實體創建IEnityRepository接口(用實際名稱替換實體)。然後我將這些傳遞給我的控制器的構造函數。

在單元測試期間,我只是使用Mocking庫來傳遞我需要的存儲庫的模擬實現,並返回一些我可以在單元測試中使用的已知數據集。

+0

我也想過了。不過我更喜歡集成測試,因爲有兩個原因:1)更有可能找到LINQ表達式 - >使用真實數據庫的SQL腳本映射問題,而不是嘲笑2)您必須添加額外的圖層來隱藏您想要應用的數據服務的DbContext單元測試 – YMC

4

單元測試意味着測試單元=沒有數據庫,沒有外部依賴性,只是測試單個可測試單元。一旦你想涉及數據庫,你就不再進行單元測試 - 你正在進行集成測試。

我寫了關於代碼依賴於EF的單元測試/集成測試的多個答案。最後一個是here。所以如果你的服務層在上下文中創建linq查詢,你不能可靠地單元測試它們。您需要集成測試。

我會使用與您期望在您的真實代碼中使用相同的數據庫。爲什麼?由於數據庫提供的映射和行爲可能與LINQ的實現不同。同樣在SQL服務器的情況下,你可以使用special EF features,這在SQLite中不一定是可用的。另一個原因是,上次我檢查它時,SQLite的提供者不支持數據庫刪除,娛樂等,這是人們通常希望用於集成測試的東西。解決方案可以是Devart provider

+0

對,我正在談論集成測試。我提到了單元測試,只是爲了讓你知道這個集成測試應該在某種程度上取代服務級別的單元測試,我的意思是我不會這麼做。感謝有關SQL Lite的信息。 – YMC

+0

我想添加到我以前的評論:我關心的基於文件系統(而不是內存)數據庫是性能。單元測試是我們構建過程的一部分,大量數據庫操作可能會損害構建的整體性能 – YMC

+0

@YMC:如果要使用數據庫測試應用程序,您將始終需要集成測試。唯一的問題是你需要多少人。你想測試你的應用程序嗎?所以付出代價並且使用更慢的版本或安裝構建服務器,並讓構建和集成測試在單獨的機器上執行。 –

相關問題