工作单元测试实体框架6.1.3 DB优先

本文关键字:DB 优先 单元测试 实体 框架 工作 | 更新日期: 2023-09-27 18:29:54

我在使用Effort框架(1.1.4版)对DB层进行单元测试时遇到问题。

我有一个使用Entity框架6.1.3的DB层,模型是使用数据库优先的方法创建的,因此有一个描述模型的*.edmx文件。

我创建了一个分部类来公开单元测试使用的额外构造函数,其工作如下:

public partial class Entities
{
    public Entities(DbConnection connection)
        : base(connection, true)
    {
    }
}

简单的单元测试如下:

    private Entities CreateContext()
    {
        //var connectionString = ConfigurationManager.ConnectionStrings["Entities"].ConnectionString;
        //var connection = Effort.EntityConnectionFactory.CreateTransient(connectionString);
        //return new Entities(connection as DbConnection);
        var connection = Effort.EntityConnectionFactory.CreatePersistent("name=Entities");
        var context = new Entities(connection);
        return context;
    }
    [TestMethod]
    public void Testing_Effort_Integration()
    {
        using (var context = CreateContext())
        {
            var entity = context.TableEntity.FirstOrDefault(i=> i.Id);
            Assert.IsNotNull(entity);
        }
    }

当我运行单元测试时,它为以下行抛出一个异常:

var connection  = Effort.EntityConnectionFactory.CreatePersistent("name=Entities");

{"提供程序未返回ProviderManifest实例。"}InnerException消息:{"无法确定存储版本;有效的需要存储连接或版本提示。"}

我发现的其他帖子建议将*.edmx文件中的ProviderManifestToken属性从"2012"更改为"2008"。这似乎解决了问题,但当我第一次尝试在这里使用上下文时,却出现了另一个例外:

var entity = context.TableEntity.FirstOrDefault(i=> i.Id);

NotSupportedException无法确定的提供程序名称类型的供应商工厂"System.Data.EntityClient.EntityProviderFactory"。请确保ADO.NET提供程序已在应用程序配置中安装或注册。

有人知道如何解决这个问题,这样我就可以使用实体框架6.1.3 DB优先的Effort方法吗?

我已经成功地使用Effort(1.1.4版)以DB优先的方法对EF 4和EF 5中创建的DB层进行了单元测试——这就是为什么我认为EF版本可能会引起兴趣。。。

工作单元测试实体框架6.1.3 DB优先

我的一位同事找到了解决我问题的方法!

显然,我使用的是"Effort"nuget包,而不是"Effort.EF6"nuget程序包。在卸载和安装另一个之后,我还必须用标签更新我的App.Config:

  <system.data>
    <DbProviderFactories>
      <add name="Effort.Provider" invariant="Effort.Provider" description="Effort.Provider" type="Effort.Provider.EffortProviderFactory,Effort" />  
    </DbProviderFactories>
  </system.data>
  <entityFramework>
    <providers>
      <provider invariantName="Effort.Provider" type="Effort.Provider.EffortProviderServices, Effort" />
    </providers>
  </entityFramework>

我还为我的单元测试在SetUp中加入了一个调用,以注册工作提供者:

    [SetUp]
    public void Setup()
    {
        EffortProviderConfiguration.RegisterProvider();
    }

这为我解决了这个问题。希望它能为其他人提供一些帮助!