gpt4 book ai didi

c# - DeploymentItem 在单独的程序集中破坏了 EntityFramework 单元测试

转载 作者:太空狗 更新时间:2023-10-29 21:17:33 24 4
gpt4 key购买 nike

我的解决方案中有 5 个程序集:A , B , B.Test , CC.Test . BC均引用 A (并且不要互相引用)。 B.Test引用文献 AB , C.Test引用文献 AC .

B.Test ,我正在创建一个 EntityFramework6 DbContext B 中定义的对象:

[TestMethod]
public void TestB() {
MyBContext c = new MyBContext();
}

C.Test ,我有一个空的单元测试 DeploymentItem :

[TestMethod]
[DeploymentItem("data.txt")]
public void TestC() { }

当我分别运行这两个测试时,它们都通过了。但是,当我“全部运行”两个测试作为同一测试运行的一部分时,TestB失败并出现以下异常:

"The Entity Framework provider type 'System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer' registered in the application config file for the ADO.NET provider with invariant name 'System.Data.SqlClient' could not be loaded. Make sure that the assembly-qualified name is used and that the assembly is available to the running application. See http://go.microsoft.com/fwlink/?LinkId=260882 for more information."

当我改变 TestC注释掉 DeploymentItem属性如下:

[TestMethod]
//[DeploymentItem("data.txt")]
public void TestC() { }

两个测试现在都通过了TestB创建上下文而不抛出异常。不知何故,加入 DeploymentItemAttribute在装配C.Test正在破坏不使用 DeploymentItem 的测试在一个单独的组件中 B.Test (我在 C.Test 中还有其他使用 DeploymentItem 的测试,因此删除这个实例不会从库中删除引用)。到目前为止,我什至花了很多时间来缩小故障范围,而且我什至不知道下一步该怎么做才能解决这个问题。

编辑: 我在 MSDN 上找到了一些似乎可以解决此问题的信息(尽管我不明白为什么)。

  1. 通过 Resharper 测试运行器或其他测试运行器运行单元测试似乎可以解决问题。只有当我通过 VisualStudio(2012,如果重要的话)运行单元测试时,测试才会失败
  2. 将以下代码添加到我定义 DbContext 的程序集中似乎可以解决问题:

    static MyDbContext () {
    var _ = typeof(System.Data.Entity.SqlServer.SqlProviderServices);
    }

    (MSDN 上的答案建议将其添加到上下文类本身,我将其添加到该上下文的工厂类型,而不是具有相同的有益结果)。

看来我们已经找到了“如何让我的单元测试工作?”的答案。但不是“为什么首先会发生这种情况?”的问题我怀疑,鉴于此解决方案,EF6 在动态加载类型和程序集方面玩得有点快和松散,并且当从某些类型的地方执行测试时,某些程序集没有被加载。

最佳答案

问题是因为编译器不输出 EntityFramework.SqlServer.dll 因为它没有检测它是否在某处使用(它仅通过依赖注入(inject)使用)。最简单的解决方案是在测试中使用一种类型的程序集。

例如您可以创建一个属性或方法(您不需要使用它,只需将其公开为公共(public)就足够了)。为了解决这个问题,我在测试助手中创建了一个属性:

public static System.Data.Entity.SqlServer.SqlProviderServices EnsureAssemblySqlServerIsCopied { get; set; }

关于c# - DeploymentItem 在单独的程序集中破坏了 EntityFramework 单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22714663/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com