2017-10-20 83 views
3

测试渴望加载场景我们使用Effort.EF6建立一个测试套件的ASP.NET Web API 2服务针对内存数据库的工作,并且在大多数情况下这是一个奇妙的经历。与Effort.EF6

然而,无关对这个问题的原因,我们有(通过在数据库方面的构造函数运行Configuration.LazyLoadingEnabled = false; ),这意味着,如果我们忘记.Include()关系的地方,后来关闭延迟加载在EF6使用它,我们得到NullReferenceExceptions。我们希望我们的测试能够捕获这些类型的错误。

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

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

问题是我们无法弄清楚如何Effort.EF6配置为不允许延迟加载,因为它似乎我们已经加入到我们的测试设置情况下任何已经被加载时,被测代码运行,因此我们从来没有看到例外。我们假设这是因为我们在测试设置和实际代码执行之间重新使用上下文实例。

如果我们试图到第三步骤切换到以下内容:

  • 注册在用于分贝连接DI容器一个服务覆盖。尽管我们增加了一些数据
  • 的DI容器创建一个数据库上下文实例(取数据库连接作为注入依赖)
  • 我们,而不是与分贝背景下结束了,也就是没有数据在运行测试之前点。

    我们如何使用Effort构造并注入一个数据库上下文,如果.Include()语句丢失,将会失败,但如果它在那里工作,将会失败?

    +0

    你是如何禁用延迟加载?我认为在'DbContext'构造函数中这样做会普遍实现。 –

    +0

    我们的'Configuration.LazyLoadingEnabled = false;'在我们的数据库上下文的构造函数中;编辑以包含这一事实。 –

    +0

    在我看来,您应该能够为每个单元测试使用原始上下文,并且应该始终加载您希望它加载到测试中的数据。如果这没有发生,我想知道你的配置是否正确。 –

    回答

    0

    你必须在构造函数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; 
        } 
    } 
    

    而且在我的测试项目,我设立测试CSV文件。这些文件将被Effort.EF6用来实例化带有种子数据的上下文。在我来说,我写了一个小TestDataManager,使该possability种子与特定文件的特定表。

    下面是一段代码,你可以如何与Effort.EF6种子数据:

    IDataLoader loader = new CsvDataLoader(@"C:\Temp\Test_CSV_Files"); 
    DbConnection dbConnection = DbConnectionFactory.CreateTransient(loader); 
    var myDataContext = new MyDataContext(dbConnection); 
    

    也许这blog post可以帮助你。

    +0

    我会将此标记为已接受的答案,尽管我们已经在此处设置了所有组件。事实证明,实际的问题是测试并行运行,但共享数据库实例,从而擦除彼此的数据。 (并发很难...)所以我们禁用了测试并行化,现在一切正常:) –