集成测试 entity framework - 仅为 PROD 分离种子方法调用 -
Integration testing the entity framework - separate the seed method call only for PROD -
我想集成测试我的存储库。
我想在每个集成测试方法之前设置和插入测试数据。
然后我想执行我的存储库逻辑
然后我想通过从数据库返回正确的数据来断言逻辑有效。
我不想模拟和单元测试 DbSet ;-) 只是真正的集成测试。
我的问题是关于数据库的整个设置和清除测试数据。
我使用代码优先方法生成 TestDatabase 和 ProdDatabase。在 ProdDatabase 中,我 播种 真实数据,然后在 UI 中使用它并检查正确的行为。 TestDatabase 仅用于集成测试。
两个数据库都是从一个上下文创建的。
当我更改实体的任何 属性 并且我 运行 我的集成测试时,我的 DbContext 中覆盖的 Seed 方法也会被调用。但我不想为我的 TestDatabase 使用它。
如何分离仅对我的 ProdDatabase 发生的种子调用?我的 TestDatabase 为每个测试生成自己的 "seed"/setup 数据?
在每种情况下,您都可以在应用程序启动期间 set a different IDatabaseInitializer
或 DbMigrationsConfiguration
(如果您使用 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)
强制初始化。
我想集成测试我的存储库。
我想在每个集成测试方法之前设置和插入测试数据。 然后我想执行我的存储库逻辑 然后我想通过从数据库返回正确的数据来断言逻辑有效。
我不想模拟和单元测试 DbSet ;-) 只是真正的集成测试。
我的问题是关于数据库的整个设置和清除测试数据。
我使用代码优先方法生成 TestDatabase 和 ProdDatabase。在 ProdDatabase 中,我 播种 真实数据,然后在 UI 中使用它并检查正确的行为。 TestDatabase 仅用于集成测试。
两个数据库都是从一个上下文创建的。
当我更改实体的任何 属性 并且我 运行 我的集成测试时,我的 DbContext 中覆盖的 Seed 方法也会被调用。但我不想为我的 TestDatabase 使用它。
如何分离仅对我的 ProdDatabase 发生的种子调用?我的 TestDatabase 为每个测试生成自己的 "seed"/setup 数据?
在每种情况下,您都可以在应用程序启动期间 set a different IDatabaseInitializer
或 DbMigrationsConfiguration
(如果您使用 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)
强制初始化。