我正在尝试使用EF 6.1进行集成测试,并遇到一个问题,即在我不需要的情况下使用我的迁移配置设置。我无法弄清楚如何将它们换成测试。 这是我的测试类:
[TestClass]
public class SXSeasonConverterTests
{
public void RecreateDatabaseForTesting()
{
Database.SetInitializer(new TestDatabaseSeedingInitializer());
using (var context = new BaseNFLContext("NFLContextIntegrationTests"))
{
context.Database.Initialize(true);
}
}
public SXSeasonConverterTests()
{
RecreateDatabaseForTesting();
}
}
这是我的初始化程序类:
public class TestDatabaseSeedingInitializer : DropCreateDatabaseAlways<BaseNFLContext>
{
protected override void Seed(BaseNFLContext context)
{
//Add Teams
context.Teams.Add(new Team { Code = "ARZ", Name = "Arizona Cardinals" });
context.Teams.Add(new Team { Code = "ATL", Name = "Atlanta Falcons" });
...
}
}
但是当我尝试运行测试时,我收到了我的AutomaticMigrations被禁用的错误。当我进一步观察时,我发现它在Initialize上使用了这段代码:
internal sealed class NFLConfiguration : DbMigrationsConfiguration<BaseNFLContext>
{
public NFLConfiguration()
{
AutomaticMigrationsEnabled = false;
AutomaticMigrationDataLossAllowed = false;
}
}
此代码显然适用于生产。但是,在进行测试时,如何交换这些迁移配置并设置AutomaticMigrationsEnabled = true;
?
答案 0 :(得分:0)
我曾经使用一个特殊的单元测试数据库测试我的EF东西,并在一个在测试结束时回滚的TransactionScope中执行测试。这样,数据库中实际上没有存储任何数据。
我并不快,但它符合我们的目的。
答案 1 :(得分:0)
您应该创建一个单独的项目进行测试,并拥有一个指向测试数据库的单独Db上下文。您可以创建类似IDbContext
接口的东西,告诉您需要测试哪些对象模型。此外,数据访问层需要允许您将此测试Db上下文作为依赖项注入。