微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

内存数据库的单元/集成测试不适用于 IQueryables

如何解决内存数据库的单元/集成测试不适用于 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 举报,一经查实,本站将立刻删除。