17

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

我有一个使用实体框架 6.1.3 的数据库层,并且模型是使用数据库优先方法创建的,因此有一个*.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 消息:{“无法确定存储版本;需要有效的存储连接或版本提示。”}

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

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

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

任何人都知道如何解决这个问题,以便我可以将 Effort 与实体框架 6.1.3 DB-first 方法一起使用?

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

4

1 回答 1

25

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

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

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

于 2016-01-12T13:55:14.187 回答