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

标签 c# entity-framework unit-testing effort

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

我有一个使用 Entity Framework 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");

{"The provider did not return a ProviderManifest instance."} InnerException Message: {"Could not determine storage version; a valid storage connection or a version hint is required."}

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

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

NotSupportedException Unable to determine the provider name for provider factory of type 'System.Data.EntityClient.EntityProviderFactory'. Make sure that the ADO.NET provider is installed or registered in the application config.

有人知道如何解决这个问题,以便我可以将 Effort 与 Entity Framework 6.1.3 DB 优先方法一起使用吗?

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

最佳答案

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

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

这解决了我的问题。希望能对其他人有所帮助!

关于c# - 努力单元测试 Entity Framework 6.1.3 DB-first,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34743196/

相关文章:

c# - 在以匿名类型重用 ScriptEngine 时如何避免 "Duplicate type name within an assembly"?

c# - 在另一个 ViewModel 中完成数据库更改后,如何 "refresh"我的 ViewModels?

c# - 从数据库中完全替换 Entity Framework 数据模型似乎是不可能的

javascript - 无法读取 null 的属性 'spyOn' - 在 angularJS 单元测试中模拟 promise

python - 运行 python 单元测试时切换分支

c# - visual studio xamarin.forms 中的秒表将 100 毫秒添加到 react 时间测试

c# - 将下拉菜单与年份绑定(bind)

c# - 将 RGB 转换为 CMYK,使用 ICC 配置文件

c# - EF5 收到此错误消息 : Model compatibility cannot be checked because the database does not contain model metadata

java - 如何使用 junit ExpectedException?