在我的应用程序中,我有多个小实体框架dbcontexts,它们共享同一个数据库,例如:
public class Context1 : DbContext {
public Context1()
: base("DemoDb") {
}
}
public class Context2 : DbContext {
public Context2()
: base("DemoDb") {
}
}
Run Code Online (Sandbox Code Playgroud)
所有数据库更新都是通过脚本完成的,不依赖于迁移(它们也不会继续).问题是 - 你将如何针对这些背景进行集成测试?
我相信这里有三种选择(可能还有更多我不知道)
选项1 - 超级上下文 - 包含设置数据库所需的所有模型和配置的上下文:
public class SuperContext : DbContext
{
public SuperContext()
: base("DemoDb") {
}
}
Run Code Online (Sandbox Code Playgroud)
在此选项中,将针对超级上下文设置测试数据库,并且所有后续测试将通过较小的上下文完成.我不喜欢这个选项的原因是我将复制我已经构建的所有配置和实体模型.
选项2 - 为集成测试创建自定义初始化程序,该集成测试将运行所有相应的db初始化脚本:
public class IntegrationTestInitializer : IDatabaseInitializer<DbContext> {
public void InitializeDatabase(DbContext context) {
/* run scripts to set up database here */
}
}
Run Code Online (Sandbox Code Playgroud)
此选项允许针对真实的数据库结构进行测试,但每次添加新的db脚本时也需要更新
选项3 - 只测试各个上下文:
在这个选项中,只需让EF根据上下文创建测试数据库,所有测试都将在自己的"沙箱"中运行.我不喜欢这个的原因是它不会让你觉得你要测试数据库的真实表示. …