2015-11-09 94 views
2

我有一堆测试,我在EF7中使用新的UseInMemory函数。当我运行它们时,其中一些失败。当我跑他们单人他们都通过。 我最好猜测这是EF7中的冲突,因为每个测试都在自己的线程中运行,并且它们都使用相同的DbContext类。我测试的 这里之一:单元测试使用Entity Framework 7,测试有时会失败?

[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

问题是,InMemoryDatabase中的内存存储被注册为Singleton,因此即使您认为您不需要,也可以在DbContext之间共享数据。

你必须创建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>() 
+0

你如何做到这一点,如果你实际测试的ASP.NET应用程序的核心,它的配置的DbContext在其Startup.ConfigureServices方法? – ssmith

+0

@ssmith:您可以配置您的单元测试以在内存数据上下文中使用。它与你的应用程序设置没有任何关系。 –