在我的应用程序有共享同一数据库的多个小实体框架dbcontexts多个实体框架dbcontexts,例如:集成测试共享数据库
public class Context1 : DbContext {
public Context1()
: base("DemoDb") {
}
}
public class Context2 : DbContext {
public Context2()
: base("DemoDb") {
}
}
所有数据库的更新将通过脚本完成,不依赖关于迁移(他们也不会前进)。问题是 - 你将如何对这些情况进行集成测试?
我认为有三个选项位置(可能还有更多我只是不知道他们)
选项1 - 超级语境 - 其中包含了设置数据库所需的所有型号和配置的上下文:
public class SuperContext : DbContext
{
public SuperContext()
: base("DemoDb") {
}
}
在这个选项中测试数据库将是对超环境和所有后续的测试设置将通过更小的环境来完成。 我不喜欢这个选项的原因是我将复制我已经构建的所有配置和实体模型。
选项2 - 创建集成测试自定义初始化器将运行所有相应的数据库初始化脚本:
public class IntegrationTestInitializer : IDatabaseInitializer<DbContext> {
public void InitializeDatabase(DbContext context) {
/* run scripts to set up database here */
}
}
该选项允许对真正的数据库结构测试,但也需要更新每次新DB脚本添加
选项3 - 只是测试了个别的背景:
在这个选项中,可以让EF根据上下文创建测试数据库,并且所有测试都可以在自己的“沙箱”中运行。 我不喜欢这个的原因是,它不觉得你会测试数据库的真实表示。
我目前正在向选项2摇摆。你们都在想什么?那里有更好的方法吗?
虽然我喜欢在每个文件中阅读的想法,这样我就不必更新初始化程序,唯一的问题是通常脚本需要按照某个顺序运行。例如,如果脚本1创建了一个表,但脚本2向该表添加了一个字段并且脚本2先运行,那么它将失败。我相信可以有一个解决方法,但 – tully2003 2014-10-09 11:49:14
前缀带有ISO 8601格式的日期时间戳文件的名称。 – 2014-10-09 12:25:26
是的,这将是一个明智的事情 - 不知道为什么我没有想到,但谢谢:) – tully2003 2014-10-09 13:04:05