【发布时间】:2014-12-03 03:22:54
【问题描述】:
在我的应用程序中,我有多个共享同一个数据库的小型实体框架 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 */
}
}
此选项允许针对真实的数据库结构进行测试,但也需要在每次添加新的数据库脚本时进行更新
选项 3 - 仅测试各个上下文:
在此选项中,只需让 EF 根据上下文创建测试数据库,所有测试都将在自己的“沙箱”中运行。 我不喜欢这样的原因是,您不会觉得您会针对数据库的真实表示进行测试。
我目前倾向于选项 2。你们觉得呢?有没有更好的方法?
【问题讨论】:
标签: c# entity-framework