2012-03-09 61 views
2

我在整個項目中都使用Entity Framework 4,Ninject和Moq。當我使用EF4服務類的肉時,我實例化了一個數據上下文 - 這很糟糕。如何EF4 + Ninject + Moq?

我要注入數據上下文爲我服務,讓我的單元測試可以針對虛擬數據方面的工作。我之前使用nHibernate完成了這個工作,但是我無法用EF4來解決這個問題,而且在網上找不到一個可靠的例子。

任何人都可以指出我的工作解決方案和例子嗎?非常感謝!

回答

4

建議的方法是使用一個內存數據庫來測試針對(使用SQLite),類似的技術如在NHibernate 3.0 cookbook描述測試NHibernate的。

您也可以創建一個假的DbContext的描述看here

+0

這可能是我找到的最好的例子,但它跳過了如何整合實際觸及數據庫的代碼,而只是談論如何模擬一切: http://blogs.msdn.com/ b/adonet/archive/2009/12/17/walkthrough-test-driven-development-with-the-entity-framework-4-0.aspx 我希望找到一個EF4項目的工作示例, db,然後如何修改它,以便進行DI,嘲諷/測試等。 – znelson 2012-03-09 20:32:26

+2

該示例使用EF上的存儲庫模式,這將允許您模擬存儲庫實現。然而,沒有使用帶有ORM的存儲庫有很好的參數。請參閱http://stackoverflow.com/questions/5625746/generic-repository-with-ef-4-1-what-is-the-point/5626884#5626884。此外,請參閱http://stackoverflow.com/questions/5609508/asp-net-mvc3-and-entity-framework-code-first-architecture/5610685#5610685關於使用集成測試的討論。 – devdigital 2012-03-09 20:42:09

+0

其中一個觀點是,如果您使用存儲庫並模擬實現,那麼您不測試實體框架,並且您的LINQ查詢可能會在生產中失敗,因此集成測試與內存數據庫實際上測試EF。 – devdigital 2012-03-09 20:44:34

0

在我的公司,我們使用本地開發數據庫和TransactionScope來回滾更改。測試刀片時獨特的副作用是增加身份,但這不是問題。

好處是你有一個真正的測試數據庫。

如果您需要發送電子郵件或發送數據到另一臺服務器,然後再回到IoC和依賴注入,使用ninject /最小起訂量。

您需要將實體框架和連接字符串添加到您的測試項目中。

[TestClass] 
public class NameValueTest 
{ 
    [TestMethod] 
    public void Create() 
    { 
     NameValueController controller = new NameValueController(); 

     using (var ts = new TransactionScope()) 
     { 
      Assert.IsNotNull(controller.Create(new Models.NameValue() 
      { 
       name1 = "1", 
       name2 = "2", 
       name3 = "3", 
       name4 = "4" 
      })); 

      //no complete, automatically abort 
      //ts.Complete(); 
     } 
    } 
} 

我希望這可以幫助你。