【问题标题】:UseInMemoryDatabase context isn't being shared across unit testsUseInMemoryDatabase 上下文未在单元测试之间共享
【发布时间】:2017-10-15 18:18:29
【问题描述】:

我正在使用 Entity Framework Core 2.0-preview1 和 InMemory 2.0-preview1。 每个单元测试类都继承一个一次性类,该类会创建一个新的内存数据库,供其父级使用。

public Constructor()
{
    var services = new ServiceCollection();

    services.AddEntityFrameworkInMemoryDatabase()
        .AddDbContext<DBContext>(o => o.UseInMemoryDatabase("Test"));

    var serviceProvider = services.BuildServiceProvider();

    Context = serviceProvider.GetRequiredService<DBContext>();
}

给数据库命名的问题是它不能在多个测试之间共享,因此每个测试都会创建一个新的上下文,导致每个单元测试持续几秒钟,这对我的构建服务器来说是不可接受的。我找不到太多关于为什么在 2.0 中更改此内容或如何解决此问题的文档。 我尝试使用新的.UseTransientInMemoryDatabase,但这似乎没有任何改变。

【问题讨论】:

  • 如果跨单元测试共享相同的数据库上下文,如何确保每个测试的特定前置条件和断言后置条件?
  • 我对添加到上下文中的实体进行一些跟踪,并在每次测试后将它们刷新,这使我能够绕过每个请求的数据库初始化时间。
  • 你试过使用静态构造函数吗?
  • 使用什么测试框架?
  • 设置一个夹具来提供你的数据库

标签: c# sql asp.net-core entity-framework-core xunit


【解决方案1】:

我使用 xUnit 固定装置为我的所有测试实例提供保存数据库上下文。这样我就避免了每次测试的上下文创建开销,这大大加快了构建服务器的速度。

【讨论】:

  • 在 xUnit 中,为了跨测试共享对象,我们使用构造函数创建在整个 Test 类中可用的共享属性。
  • @peter.fr 需要一个固定装置,因为它不仅是类实例所必需的,而且是整个命名空间所必需的。
猜你喜欢
  • 2011-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-04
  • 1970-01-01
  • 1970-01-01
  • 2018-12-21
相关资源
最近更新 更多