2009-12-29 103 views
7

我已經在本文中用EF4中的POCO僞造了對象上下文和IObjectSet來實現單元測試。實體框架4.0單元測試

http://blogs.msdn.com/adonet/archive/2009/12/17/test-driven-development-walkthrough-with-the-entity-framework-4-0.aspx

但我不能確定如何實現對測試我的假對象上下文幾個方法。我在我的對象上下文接口上有CreateQuery和ExecuteFunction方法,這樣我就可以執行ESQL和存儲過程,但我不能(很容易)在我的假對象上下文中實現它們。

另一種方法是使用我的倉庫,而不是我的對象上下文的雙重考驗兼作這裏建議:

http://social.msdn.microsoft.com/Forums/en-US/adonetefx/thread/c4921443-e8a3-4414-92dd-eba1480a07ad/

但是,這將意味着我的真實資料庫心不是正在測試,似乎只是繞過這個問題。

誰能提供任何建議?

回答

11

據我可以告訴你的問題,你試圖在同一時間測試太多。記住Single Responsibility Principle

當我們進行單元測試時,我們使用抽象存儲庫將數據訪問代碼從應用程序的其餘部分抽象出來。從這個角度來看,我們只測試版本庫的消費者,而不是任何具體的版本庫。這樣的消費者應該只關心關於存儲庫的,而不關心任何「對象上下文」 - 這將是一個漏洞抽象

想象一下,您意外地被要求將存儲庫使用者連接到完全不同的數據層(例如基於REST的服務)。在這種情況下,即使抽象的對象上下文也沒有意義。您可能從未想到會發生這種情況,但即便如此,思想實驗本身也是漏泄抽象的一個很好的指標。

對象上下文是使用EF的具體Repository實現的實現細節。其他實現可能完全不需要對象上下文。

也就是說,您可能仍然想測試EF實現本身。這可能很有意義,但這是一個完全不同的單元測試套件。您現在正在測試存儲庫的具體實現,而不是測試抽象存儲庫的使用者。在這種情況下,不需要通過接口 - 您可以直接與這裏的具體類型進行交流。

+0

偉大的答案IMO – 2010-10-21 11:17:55

+0

偉大的答案確實如此。你知道任何有效的方法來測試存儲庫嗎?理想情況下,我會爲此使用內存數據庫,除非EF4在沒有重大修改的情況下無法使用。 – 2010-12-08 22:49:22

+0

我不知道EF4(我已經或多或少地放棄了EF),但在以前的版本中,沒有任何接口能以任何簡單的方式啓用內存數據庫。從理論上講,由於EF基於可擴展的提供者模型,因此如果可以找到提供者,則可以將內存中的數據庫用作底層數據庫,但我不知道其中的任何提供者。然後,我再也沒有看很久...... – 2010-12-09 04:27:04

0

是否有可能使用內存數據庫(如SQLite)測試實際存儲庫?有一個實體框架的SQLite提供程序。

似乎edmx文件中的SSDL部分與提供者耦合。如果從Sql-server數據庫生成模型,則將設置provider =「System.Data.SqlClient」。如果您從實體模型生成sql-server數據庫,這也將被設置。

我真的很想讓我的生產代碼使用System.Data.SqlClient提供程序和我的單元測試使用System.Data.SqLite提供程序。

+0

只要有一個支持EF的數據庫提供者,用EF轉出數據庫並不是很難。這裏有一篇關於如何完成這個任務的好帖子:http://mosesofegypt.net/post/Multiple-database-support-with-Entity-Framework.aspx – Odrade 2010-12-14 17:22:29