我在整個項目中都使用Entity Framework 4,Ninject和Moq。當我使用EF4服務類的肉時,我實例化了一個數據上下文 - 這很糟糕。如何EF4 + Ninject + Moq?
我要注入數據上下文爲我服務,讓我的單元測試可以針對虛擬數據方面的工作。我之前使用nHibernate完成了這個工作,但是我無法用EF4來解決這個問題,而且在網上找不到一個可靠的例子。
任何人都可以指出我的工作解決方案和例子嗎?非常感謝!
我在整個項目中都使用Entity Framework 4,Ninject和Moq。當我使用EF4服務類的肉時,我實例化了一個數據上下文 - 這很糟糕。如何EF4 + Ninject + Moq?
我要注入數據上下文爲我服務,讓我的單元測試可以針對虛擬數據方面的工作。我之前使用nHibernate完成了這個工作,但是我無法用EF4來解決這個問題,而且在網上找不到一個可靠的例子。
任何人都可以指出我的工作解決方案和例子嗎?非常感謝!
建議的方法是使用一個內存數據庫來測試針對(使用SQLite),類似的技術如在NHibernate 3.0 cookbook描述測試NHibernate的。
您也可以創建一個假的DbContext的描述看here。
在我的公司,我們使用本地開發數據庫和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();
}
}
}
我希望這可以幫助你。
這可能是我找到的最好的例子,但它跳過了如何整合實際觸及數據庫的代碼,而只是談論如何模擬一切: 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
該示例使用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
其中一個觀點是,如果您使用存儲庫並模擬實現,那麼您不測試實體框架,並且您的LINQ查詢可能會在生產中失敗,因此集成測試與內存數據庫實際上測試EF。 – devdigital 2012-03-09 20:44:34