使用Effort.EF6测试预加载方案


我们正在使用Effort.EF6来构建针对内存数据库的ASP.NET Web API 2服务的测试套件,并且在很大程度上它是一种美妙的体验。

但是,由于与此问题无关的原因,我们不得不关闭EF6中的延迟加载(通过运行Configuration.LazyLoadingEnabled = false;在db上下文的构造函数中),这意味着如果我们忘记.Include()关系某处,后来使用它,我们得到NullReferenceExceptions 。我们希望我们的测试可以捕获这些类型的错误。

我们的测试设置基本如下:

  1. 使用Effort的连接工厂创建数据库连接。每次测试时,这是一个唯一的连接实例(当我们尝试使用持久连接时使用唯一键)。
  2. 使用该连接创建数据库上下文,并添加我们想要存在的数据以进行测试。
  3. 在数据库上下文的DI容器中注册服务覆盖。

问题是我们无法弄清楚如何配置Effort.EF6以禁止延迟加载,因为我们在测试设置中添加到上下文中的任何内容似乎已经在测试中的代码运行时加载,因此我们从不看例外。我们假设这是因为我们在测试设置和实际代码执行之间重用了上下文实例。

如果我们尝试将第三步切换到以下步骤:

  1. 在DI容器中为数据库连接注册服务覆盖。
  2. DI容器创建一个db上下文实例(将db连接作为注入依赖项)

我们最终得到一个空的 db上下文,即尽管我们在运行测试之前添加了一些数据点但它没有数据。

我们如何使用Effort构造和注入db上下文,如果缺少.Include()语句,它将失败但是如果它存在则会工作?

一般承认的答案

您必须在Effort.EF6的构造函数中停用它 - 获取DbConnection对象的构造函数。

我解决了我的EF Code First项目,如下所示:

public class MyDataContext : DbContext, IMyDataContext
{
    /*
    * the ohter stuff like IDbSet<T> etc.
    */


    public MyDataContext() : base("name=MyConnectionString")
    {
        Configure();
    }

    /// <summary>
    /// This constructor is for test usage only!
    /// </summary>
    /// <param name="connection">Test connection for in memory database</param>
    public MyDataContext(DbConnection connection) : base(connection, true)
    {
        Configure();
    }


    /// <summary>
    /// Configures the data context.
    /// </summary>
    private void Configure()
    {
        Configuration.LazyLoadingEnabled = false;
    }
}

此外,在我的测试项目中,我正在设置测试CSV文件。 Effort.EF6将使用这些文件来实例化具有种子数据的上下文。在我的例子中,我编写了一个小的TestDataManager,它可以为特定的文件提供特定的表。

以下是一段代码,您可以使用Effort.EF6对数据进行种子设定:

public class MyDataContext : DbContext, IMyDataContext
{
    /*
    * the ohter stuff like IDbSet<T> etc.
    */


    public MyDataContext() : base("name=MyConnectionString")
    {
        Configure();
    }

    /// <summary>
    /// This constructor is for test usage only!
    /// </summary>
    /// <param name="connection">Test connection for in memory database</param>
    public MyDataContext(DbConnection connection) : base(connection, true)
    {
        Configure();
    }


    /// <summary>
    /// Configures the data context.
    /// </summary>
    private void Configure()
    {
        Configuration.LazyLoadingEnabled = false;
    }
}

也许这篇博文也可以帮到你。





许可下: CC-BY-SA
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因