我在我的解決方案中有5個程序集:A
,B
,B.Test
,C
和C.Test
。 B
和C
都參考A
(並不相互引用)。 B.Test
參考文獻A
和B
,C.Test
參考文獻A
和C
。DeploymentItem打破單獨程序集中的EntityFramework單元測試
在B.Test
,我建立在B
定義的EntityFramework6 DbContext
對象:
[TestMethod]
public void TestB() {
MyBContext c = new MyBContext();
}
在C.Test
,我有一個空的單元測試用DeploymentItem
:
[TestMethod]
[DeploymentItem("data.txt")]
public void TestC() { }
當我運行兩個單獨測試,他們都通過。然而,當我的相同測試運行的一部分「運行所有」兩個測試在一起,TestB
失敗,出現以下異常:
「的實體框架提供型「System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer'註冊在ADO.NET提供程序的應用程序配置文件中,該提供程序的名稱爲'System.Data.SqlClient',因此無法加載。請確保使用程序集限定名,並且程序集可用於運行請參閱http://go.microsoft.com/fwlink/?LinkId=260882瞭解更多信息。「
當我改變TestC
註釋掉DeploymentItem
屬性如下:
[TestMethod]
//[DeploymentItem("data.txt")]
public void TestC() { }
兩個測試現在通過。 TestB
創建上下文而不引發異常。不知何故,在DeploymentItemAttribute
中加入程序集C.Test
正在打破一個測試,它在一個單獨的程序集中不使用DeploymentItem
B.Test
(並且我在使用DeploymentItem的C.Test
中進行了其他測試,因此刪除此一個實例不會從該庫中刪除引用) 。這讓我花了很多時間甚至縮小了失敗的範圍,而且我完全不知道下一步該怎麼做才能解決這個問題。
編輯:我發現了一些關於MSDN似乎解決這個問題的信息(儘管我不明白爲什麼)。
- 通過Resharper測試運行器或其他測試運行器運行單元測試似乎可以解決問題。只有當我通過VisualStudio的(2012,如果它的事項)運行單元測試做測試失敗
添加以下代碼到我的組件,其定義的DbContext似乎解決該問題:
static MyDbContext() { var _ = typeof(System.Data.Entity.SqlServer.SqlProviderServices); }
(該MSDN上的答案建議將其添加到上下文類本身,我將它添加到該上下文的Factory類型,而不是具有相同的有益結果)。
所以它看起來像我們有一個答案「我如何使我的單元測試工作?」但不是「爲什麼這首先發生?」這個問題。考慮到這個解決方案,我懷疑EF6在動態加載類型和程序集方面有些快速和鬆動,並且某些程序集在從某些類型的地方執行測試時未被加載。