C# 使用efforce.EF6测试急切的加载场景

C# 使用efforce.EF6测试急切的加载场景,c#,entity-framework,unit-testing,effort,C#,Entity Framework,Unit Testing,Effort,我们正在使用它为ASP.NETWebAPI2服务构建一个测试套件,该服务针对内存中的数据库工作,在大多数情况下,这是一个美妙的体验 然而,由于与此问题无关的原因,我们不得不在EF6中关闭延迟加载(通过运行Configuration.LazyLoadingEnabled=false; 在db上下文的构造函数中),这意味着如果我们忘记.Include()某个位置的关系,然后使用它,我们会得到NullReferenceExceptions。我们希望我们的测试能够捕获这些类型的错误 我们的测试设置基本如

我们正在使用它为ASP.NETWebAPI2服务构建一个测试套件,该服务针对内存中的数据库工作,在大多数情况下,这是一个美妙的体验

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

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

  • 使用Effort的连接工厂创建db连接。这是每个测试的唯一连接实例(当我们尝试使用持久连接时,具有唯一键)
  • 使用该连接创建一个db上下文,并添加我们希望为测试存在的数据
  • 在db上下文的DI容器中注册服务覆盖
  • 问题是,我们无法确定如何配置Effort.EF6以禁止延迟加载,因为我们在测试设置中添加到上下文中的任何内容似乎在测试运行时已经加载,因此我们从未看到异常。我们假设这是因为我们在测试设置和实际代码执行之间使用上下文实例

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

  • 在DI容器中为db连接注册服务覆盖
  • DI容器创建一个db上下文实例(将db连接作为注入的依赖项)
  • 相反,我们最终得到的是一个空的db上下文,也就是说,尽管我们在运行测试之前添加了一些数据点,但它没有数据


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

    您也必须在构造函数中为Effort.EF6停用它-接受
    DbConnection
    对象的语句

    我为我的EF代码第一个项目解决了它,如下所示:

    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;
        }
    }
    

    也许这也可以帮助您。

    您如何禁用延迟加载?我认为在
    DbContext
    构造函数中执行此操作将普遍适用在数据库上下文的构造函数中;在我看来,您应该能够为每个单元测试使用原始上下文,并且它应该始终加载您希望它在测试中加载的数据。如果没有发生这种情况,我想知道您的配置是否正确。我会将此标记为可接受的答案,尽管我们已经在这里设置了所有组件。事实证明,实际的问题是测试是并行运行的,但共享一个数据库实例,因此会擦除彼此的数据。(并发很难…)所以我们禁用了测试并行化,现在一切都正常了:)
    IDataLoader loader = new CsvDataLoader(@"C:\Temp\Test_CSV_Files");
    DbConnection dbConnection = DbConnectionFactory.CreateTransient(loader);
    var myDataContext = new MyDataContext(dbConnection);