单元测试使用Entity Framework 7,测试有时会失败吗?

时间:2015-11-09 10:19:44

标签: entity-framework unit-testing

我有一堆测试,我在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对象,但似乎没有任何不同。

对于任何输入都会很有意义。谢谢:))

2 个答案:

答案 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>()