我有一堆测试,我在EF7中使用新的UseInMemory函数。当我运行它们时,其中一些都失败了。当我单独运行时,它们都会通过。 我最好的猜测是EF7中的冲突,因为每个测试都在自己的线程中运行,并且它们都使用相同的DbContext类。 这是我的一个测试:
[Fact]
public void Index()
{
DbContextOptionsBuilder<DatabaseContext> optionsBuilder = new DbContextOptionsBuilder<DatabaseContext>();
optionsBuilder.UseInMemoryDatabase();
db = new DatabaseContext(optionsBuilder.Options);
AdminController controller = new AdminController(db);
var result = controller.Index() as ViewResult;
Assert.Equal("Index", result.ViewName);
}
我在每个测试中重新制作了dbContext对象,但似乎没有任何不同。
对于任何输入都会很有意义。谢谢:))
答案 0 :(得分:2)
我也被认为是.UseInMemoryDatabase()没有持久性,但似乎并非如此(至少在最新版本中)!
如How can I reset an EF7 InMemory provider between unit tests?中所述,您想要db.Database.EnsureDeleted()
但我也注意到这不会重置自动增量ID。
答案 1 :(得分:2)
问题是,InMemoryDatabase中的内存存储被注册为Singleton,因此您实际上在DbContexts之间共享数据,即使您认为不存在。
你必须像这样创建你的DbContexts:
public abstract class UnitTestsBase
{
protected static T GetNewDbContext<T>() where T : DbContext
{
var services = new ServiceCollection();
services
.AddEntityFramework()
.AddInMemoryDatabase()
.AddDbContext<T>(options => options.UseInMemoryDatabase());
var serviceProvider = services.BuildServiceProvider();
var dbContext = serviceProvider.GetRequiredService<T>();
dbContext.Database.EnsureDeleted();
return dbContext;
}
}
var newTestDbContext = GetNewDbContext<TestDbContext>()