【问题标题】:Reusing InMemoryDatabase across unit tests跨单元测试重用 InMemoryDatabase
【发布时间】: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


【解决方案1】:

事实证明,xUnit 对这种情况有一个答案 - Collection Fixture。我按照那里的说明进行操作,结果成功了。希望它也能帮助其他人:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-24
    • 1970-01-01
    • 2022-07-25
    • 2015-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多