【问题标题】:EF Core In Memory database data leaking between unit testsEF Core In Memory 数据库数据在单元测试之间泄漏
【发布时间】:2020-04-03 11:20:24
【问题描述】:

我正在尝试使用此处所述的内存提供程序来模拟我的 EF-Core 数据库:https://docs.microsoft.com/en-us/ef/core/miscellaneous/testing/in-memory

我的测试结构如下:

[Test]
public async Task PerformTest1() {
  var options = new DbContextOptionsBuilder<MeldingenModel>()
    .UseInMemoryDatabase(nameof(PerformTest1))
    .Options;
  var protos = new List<MeldingPrototype> { ... };
  var meldingen = new List<Melding> { ... };
  using (var seedingcontext = new MeldingenModel(options)) {

    seedingcontext.MeldingPrototypes.AddRange(protos);
    seedingcontext.Meldingen.AddRange(meldingen);
    seedingcontext.SaveChanges();
  }
  using (var db = new MeldingenModel(options))
  using (var mock = AutoMock.GetLoose(cgf => cgf.RegisterInstance(db))) {

    // do test
  }
}

第一部分是将数据播种到数据库中。每个测试都有类似的模式,每个测试都使用nameof(&lt;methodname&gt;) 作为UseInMemoryDatabase 的参数。我理解该方法的文档字符串的方式,不同的字符串参数应确保所有创建的数据库都是独立的,但它们似乎仍然相互影响。如果我单独运行每个测试,它们都会通过,但同时运行它们会使它们失败。失败的原因是来自一种方法的种子数据也存在于其他测试中。

我使用的测试框架是 nUnit。

谁能帮我获得正确隔离的测试数据库?

【问题讨论】:

  • 嗨@JAD,乍一看还不错。您是否有示例应用程序,或者您手头有 dbcontext 的定义,以便我可以快速设置相同的代码,并检查发生了什么?
  • 哎呀,它目前相当大。让我看看我是否可以将其归结为一个最小的工作示例。
  • 从您发布(后来删除)的示例测试中,它看起来像这样在内存数据库中的数据在测试运行期间持续存在,我在键上遇到冲突 - 但是当我更改键范围时一切正常。我会在内存数据库中找到更多关于它的 lifetime 的信息。
  • @ironstone13 我删除了示例测试,正是因为那是我的测试失败的原因,而不是在实际版本中。换句话说,遗憾的是,它没有重现出错的地方。然而,我确实找到了真正的原因:一些不是测试中心的实体对象在测试之间被重用。实际数据存储在它们的外键集合中,因此被读入新数据库。
  • 感谢您查看它

标签: c# .net-core entity-framework-core nunit


【解决方案1】:

我倾向于执行以下操作,以确保每个单元测试确实有一个单独的数据库。

public class MyTestClass
{
  [Test]
  public async Task PerformTest1()
  {
    var options = new DbContextOptionsBuilder<MeldingenModel>()
      .UseInMemoryDatabase($"{ nameof(MyTestClass) }.{ nameof(PerformTest1) }")
      .Options;
  }
}

我看到您已经解决了您的问题。但是,确定数据库名称的唯一性仍然是一种好习惯。

干杯,迈克

【讨论】:

  • 另外,请确保在测试中使用您的任何实体都不会在测试之间共享。这可能看起来很明显,但这正是我背后的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-19
  • 1970-01-01
  • 1970-01-01
  • 2010-12-15
相关资源
最近更新 更多