c# - 使用不同的 InMemory 数据库仍然增加身份

标签 c# entity-framework-core

我正在设置我的测试框架,以针对不同的场景使用内存数据库。每个测试都使用一个“唯一”的数据库,测试的每个步骤都使用不同的 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/

相关文章:

c# - Entity Framework 选择 IQueryable 抛出 "must be reducible node"

c# - WatiN.Core.IE 组件在打开 URL 时出现 Internet Explorer 忙时超时错误

c# - 字符串属性 GET 返回什么?

c# - 将可见性绑定(bind)到可检查的菜单项在 WPF 中显示错误 "Service provider is missing the INameResolver service"

c# - "Script-Migration"可以在 .NET Entity Framework Core 中创建数据库吗?

.net - 我可以使用 EF Code First 和 .net core 生成迁移脚本吗

entity-framework-core - EF Core 诊断 - 每个上下文实例的查询计数

c# - 添加依赖注入(inject)后,Add-Migration 出现错误

c# - 为什么有些文本框不接受 Control + A 快捷方式来默认全选

c# - 单击下拉列表中的列表项