我正在设置我的测试框架,以针对不同的场景使用内存数据库。每个测试都使用一个“唯一”的数据库,测试的每个步骤都使用不同的 Entity Framework 上下文。
问题是,即使测试使用不同的“内存中”数据库,以及来自 Entity Framework 的不同上下文,数据库中的身份似乎也在增加。
例如,我有 2 个单元测试:
[Test]
public async Task CanGetAllFromRepository()
{
var options = new DbContextOptionsBuilder<MyContext>()
.UseInMemoryDatabase(databaseName: "CanGetAllFromRepository").Options;
var testa = new User();
var testb = new User();
var testc = new User();
using (var context = new MyContext(options))
{
await context.Users.AddAsync(testa);
await context.Users.AddAsync(testb);
await context.Users.AddAsync(testc);
await context.SaveChangesAsync();
}
using (var context = new MyContext(options))
{
var repo = new UserRepository(context);
var all = await repo.GetAllAsync();
Assert.IsTrue(all.Count == 3);
}
}
[Test]
public async Task CanGetByIdFromRepository()
{
var options = new DbContextOptionsBuilder<MyContext>()
.UseInMemoryDatabase(databaseName: "CanGetByIdFromRepository").Options;
var testa = new User();
var testb = new User();
var testc = new User();
using (var context = new SalesPortalContext(options))
{
await context.User.AddAsync(testa);
await context.User.AddAsync(testb);
await context.User.AddAsync(testc);
await context.SaveChangesAsync();
}
using (var context = new MyContext(options))
{
var repo = new UserRepository(context);
var usera = await repo.GetByIdAsync(1);
var userb = await repo.GetByIdAsync(2);
var userc = await repo.GetByIdAsync(3);
Assert.IsNotNull(usera);
Assert.IsNotNull(userb);
Assert.IsNotNull(userc);
}
}
如果我一个一个地运行测试,这不是问题,但是一起运行它们;然后对于第二个单元测试,用户的身份集 ID 从 4、5、6 开始。(当单独运行时,它的 1、2、3 正如预期的那样)。
更新
我设法通过手动为用户分配他们的 ID 来解决这个问题,例如:
var testa = new User() { Id = 1 };
var testb = new User() { Id = 2 };
var testc = new User() { Id = 3 };
最佳答案
我对 XUnit 做同样的事情这对我有用。 XUnit 为每个测试运行构造函数,并且在初始化上下文时没有问题。尝试使用它
关于c# - 使用不同的 InMemory 数据库仍然增加身份,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52292495/