如何解决内存数据库的单元/集成测试不适用于 IQueryables
我正在尝试使用内存数据库运行一些单元测试。我正在创建一个新实体,然后我正在检查它是否存在。如果我用 Task<IEnumerable<Entity>>
查询为 Task<Entity>
或 FindAsync(id)
,我得到模型,但如果我用 IQueryable<Entity>
检查我得到空值。带有 IQueryables 的 InMemory Db 是否有限制?因为我觉得它只是因为FindAsync()
;
代码如下:
var model = await _context.User.FindAsync(id);
返回模型
var model = await Getusermodel(id);
Task<User> Getusermodel(int id)=>
await _context.User.FindAsync(id);
返回模型
IQueryable<User> GetUser() =>
_context.User
.Include(u => u.Role)
.AsQueryable();
var model = await GetUser().AsNoTracking().FirstOrDefaultAsync(u => u.Id == id);
返回空
单元测试设置
protected static UserDbContext GetContext()
{
var options = new DbContextOptionsBuilder<UserDbContext>()
.UseInMemoryDatabase(databaseName: "TestDb")
.ConfigureWarnings(x => x.Ignore(InMemoryEventId.TransactionIgnoredWarning))
.Options;
return new UserDbContext(options);
}
单元测试
[Fact]
public async Task GetUsers_ShouldReturnUsers()
{
//Arrange
var userService = new UserService(GetContext());
await userService.createuser(Helpers.createuser());
//Act
var viewmodel = await userService.GetUsers();
//Assert
viewmodel.Should().NotBeNullOrEmpty();
}
编辑:
经过多次测试,我的直觉似乎是正确的。如果我使用 FirstOrDefaultAsync()
,它不会找到内存中创建的实体,但如果我使用 FindAsync()
,它会找到。如果我将创建的模型的值与 FindAsync()
获取的模型进行比较,它会返回 true,所以我知道我的 IQueryable
方法应该可以工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。