集成测试 entity framework - 仅为 PROD 分离种子方法调用 -

Integration testing the entity framework - separate the seed method call only for PROD -

我想集成测试我的存储库。

我想在每个集成测试方法之前设置和插入测试数据。 然后我想执行我的存储库逻辑 然后我想通过从数据库返回正确的数据来断言逻辑有效。

我不想模拟和单元测试 DbSet ;-) 只是真正的集成测试。

我的问题是关于数据库的整个设置和清除测试数据。

我使用代码优先方法生成 TestDatabaseProdDatabase。在 ProdDatabase 中,我 播种 真实数据,然后在 UI 中使用它并检查正确的行为。 TestDatabase 仅用于集成测试。

两个数据库都是从一个上下文创建的。

当我更改实体的任何 属性 并且我 运行 我的集成测试时,我的 DbContext 中覆盖的 Seed 方法也会被调用。但我不想为我的 TestDatabase 使用它。

如何分离仅对我的 ProdDatabase 发生的种子调用?我的 TestDatabase 为每个测试生成自己的 "seed"/setup 数据?

在每种情况下,您都可以在应用程序启动期间 set a different IDatabaseInitializerDbMigrationsConfiguration(如果您使用 MigrateDatabaseToLatestVersion 作为初始化程序):

System.Data.Entity.Database.SetInitializer(new TestOrProdInitializer());

您甚至可以为生产和测试使用不同的 configuration file settings 设置数据库初始化程序:

<contexts> 
  <context type=" Blogging.BlogContext, MyAssembly"> 
    <databaseInitializer type="Blogging.MyCustomBlogInitializer, MyAssembly" /> 
  </context> 
</contexts>

如果删除数据库后需要重新设定种子,也可以使用dbContext.Database.Initialize(true)强制初始化。