努力单元测试Entity Framework 6.1.3 DB-first

17

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

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

我创建了一个部分类来公开另一个构造函数,用于在单元测试中使用effort,就像这样:

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 Message: {"无法确定存储版本;需要有效的存储连接或版本提示。"}

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

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

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

有人知道如何解决这个问题,以便我可以使用Entity Framework 6.1.3 DB-first方法来使用Effort进行单元测试吗?

我已成功地使用Effort(版本1.1.4)来单元测试使用EF 4和EF 5创建的DB层,并采用DB-first方法。这就是为什么我认为EF版本可能会很有用的原因...

1个回答

26

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

显然,我使用的是“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();
    }

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


完成后,我遇到了以下错误:System.InvalidOperationException: 实体框架提供程序类型'MyProject.Tests.EffortProviderFactory, MyProject.Tests, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null'没有名为'Instance'的静态属性或字段。实体框架提供程序必须声明一个名为'Instance'的静态属性或字段,该属性或字段返回提供程序的单例实例。 - Matt Koch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接