【发布时间】:2014-05-08 00:33:09
【问题描述】:
我的解决方案中有 5 个程序集:A、B、B.Test、C 和 C.Test。 B 和 C 都引用 A(并且不相互引用)。 B.Test 引用 A 和 B,C.Test 引用 A 和 C。
在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, 无法加载在 ADO.NET 提供程序的应用程序配置文件中注册的具有不变名称“System.Data.SqlClient”的 EntityFramework.SqlServer'。确保使用程序集限定名称并且程序集可用于正在运行的应用程序。请参阅http://go.microsoft.com/fwlink/?LinkId=260882 了解更多信息。”
当我更改TestC 以注释掉DeploymentItem 属性时,如下所示:
[TestMethod]
//[DeploymentItem("data.txt")]
public void TestC() { }
两个测试现在都通过了。 TestB 创建上下文而不抛出异常。不知何故,在程序集C.Test 中添加DeploymentItemAttribute 正在破坏一个在单独的程序集B.Test 中不使用DeploymentItem 的测试(而且我在C.Test 中有其他使用DeploymentItem 的测试,所以删除这个实例不会从库中删除引用)。我花了很多时间才把故障范围缩小到这一步,我完全不知道下一步该怎么做才能解决这个问题。
编辑:我在 MSDN 上找到了一些似乎可以解决此问题的信息(尽管我不明白为什么)。
- 通过 Resharper 测试运行器或其他测试运行器运行单元测试似乎可以解决问题。只有当我通过 VisualStudio(2012,如果重要)运行单元测试时,测试才会失败
-
将以下代码添加到定义 DbContext 的程序集中似乎可以解决问题:
static MyDbContext () { var _ = typeof(System.Data.Entity.SqlServer.SqlProviderServices); }(MSDN 上的答案建议将其添加到上下文类本身,我将其添加到该上下文的工厂类型中,而不是具有相同的有益结果)。
所以看起来我们对“如何让我的单元测试工作?”有了一个答案。但不是“为什么首先会发生这种情况?”的问题。我怀疑,考虑到这个解决方案,EF6 在动态加载类型和程序集方面有点快和松散,当从某些类型的地方执行测试时,某些程序集没有被加载。
【问题讨论】:
标签: c# .net entity-framework unit-testing