【发布时间】: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(<methodname>) 作为UseInMemoryDatabase 的参数。我理解该方法的文档字符串的方式,不同的字符串参数应确保所有创建的数据库都是独立的,但它们似乎仍然相互影响。如果我单独运行每个测试,它们都会通过,但同时运行它们会使它们失败。失败的原因是来自一种方法的种子数据也存在于其他测试中。
我使用的测试框架是 nUnit。
谁能帮我获得正确隔离的测试数据库?
【问题讨论】:
-
嗨@JAD,乍一看还不错。您是否有示例应用程序,或者您手头有 dbcontext 的定义,以便我可以快速设置相同的代码,并检查发生了什么?
-
哎呀,它目前相当大。让我看看我是否可以将其归结为一个最小的工作示例。
-
从您发布(后来删除)的示例测试中,它看起来像这样在内存数据库中的数据在测试运行期间持续存在,我在键上遇到冲突 - 但是当我更改键范围时一切正常。我会在内存数据库中找到更多关于它的 lifetime 的信息。
-
@ironstone13 我删除了示例测试,正是因为那是我的测试失败的原因,而不是在实际版本中。换句话说,遗憾的是,它没有重现出错的地方。然而,我确实找到了真正的原因:一些不是测试中心的实体对象在测试之间被重用。实际数据存储在它们的外键集合中,因此被读入新数据库。
-
感谢您查看它
标签: c# .net-core entity-framework-core nunit