在我的应用程序中,我有多个小的实体框架数据库上下文共享同一个数据库,例如:
在这个选项中,测试数据库将根据超级上下文设置,并且所有随后的测试都将通过更小的上下文进行。 我不喜欢这个选项的原因是我将重复所有已经构建的配置和实体模型。 选项2 - 为集成测试创建一个定制的初始化程序,以运行所有适当的数据库初始化脚本:
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 */
}
}
这个选项允许针对真实的数据库结构进行测试,但也需要在每次添加新的数据库脚本时更新。
选项3 - 只测试各个上下文:
在此选项中,只需让EF基于上下文创建测试数据库,所有测试都将在其自己的“沙盒”中运行。我不喜欢这种方法的原因是它感觉就像你没有针对真实的数据库进行测试。
我目前倾向于选项2。你们认为有更好的方法吗?