首页 > 解决方案 > 使用不同的 InMemory 数据库仍会增加身份

问题描述

我正在设置我的测试框架以将内存数据库用于不同的场景。每个测试都使用一个“唯一”的数据库,并且测试的每个步骤都使用不同的实体框架上下文。

问题是,即使测试使用不同的“内存”数据库,以及来自实体框架的不同上下文,数据库中的标识似乎也会增加。

例如,我有 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 };

标签: c#entity-framework-core

解决方案


我用XUnit做同样的事情,这对我有用。XUnit 为每个测试运行构造函数,初始化上下文时没有问题。尝试使用它


推荐阅读