【发布时间】:2016-07-23 23:11:30
【问题描述】:
我有 ASP.NET MVC Core 应用程序,我正在为其编写单元测试。我正在使用 InMemoryDatabase,它运行良好。我想为测试运行初始化一次数据库。所以,我有一个静态类:
public static class DbInitialize {
private static MyDbContext _db;
public static MyDbContext Initialize() {
if (_db != null) {
return _db;
}
DbContextOptionsBuilder<MyDbContext> optionsBuilder = new DbContextOptionsBuilder<MyDbContext>();
optionsBuilder.UseInMemoryDatabase();
_db = new MyDbContext(optionsBuilder.Options);
....... (populating mock data) .............
_db.SaveChanges();
return _db;
}
}
非常适合单个测试类(例如,HomeControllerTests)及其所有特定测试。但是,如果我有另一个测试类 (CustomerControllerTests) 并且我调用 DbInitialize.Initialize() - 我看到 _db 为空,但数据库没有被破坏 - 我在 SaveChanges() 期间收到 Key 错误。有没有更好的方法来初始化数据库仅一次,如果它已经启动并运行,则获得一个“连接字符串”(因为缺少更好的词)?
【问题讨论】:
-
如果您每次都使用您的选项(没有数据)重新创建
DbContext,会发生什么? -
@GabrielGM - 我不确定我是否理解你的问题。如果我在没有数据的情况下创建 DbContext - 什么都不会发生,除非我没有数据,而且单元测试显然会失败。
-
您是说您的
_db为空,即使它“存在”在内存中。发生这种情况时,您能否重新创建_db。我的意思是,第一次创建和播种。之后,只需创建。 -
问题的本质是我怎么知道第一次是什么时候,之后是什么时候......我在xUnit文档中找到了答案;即将发布
标签: c# unit-testing asp.net-core-mvc in-memory-database