c# - 使用不同的 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 };
解决方案
我用XUnit做同样的事情,这对我有用。XUnit 为每个测试运行构造函数,初始化上下文时没有问题。尝试使用它
推荐阅读
- javascript - RefreshControll 数据重复每次在 React Native 中拉动以刷新 ScrollView
- solarwinds-orion - 如何在 Solarwinds 中获取 Spring Boot 应用程序的进程指标
- qr-code - 如何使用 zxing 从条码中获取原始数据?
- apache-spark - 在选择语句期间,S3 上的火花读取镶木地板读取多少数据是正常的?
- oracle - 去掉 PL/SQL 函数末尾的逗号 [Oracle PL/SQL]
- android - 无法解析android中的方法addsnapshot listener
- mongodb - golang中如何构造动态的mongo查询
- ios - ViewController中将UIViewController修改为UIcollectionViewContorller时出错?[迅速]
- json - 在颤动中无限加载json数据
- sockets - GPRS 上具有最小(est)开销的协议