Moq 异步 DbSet 设置 IDbAsyncQueryProvider

Moq async DbSet Setup IDbAsyncQueryProvider

我有这个最小起订量设置:

_mockContext.Setup(x => x.CarSections).Returns(new List<CarSection> { _carSection }.ToDbSet());

这基本上将列表分配给 DbContext.CarSections 的实体。

其中一种方法是异步方法。类似于:

public async Task<CarSection> GetSectionAsync(int sectionId)
    {
        return await _context
            .CarSections
            .FirstOrDefaultAsync(s => s.CarSectionId == sectionId && s.StatusCode == 4);
    }

当它通过那个方法时,我得到了错误:

The provider for the source IQueryable doesn't implement IDbAsyncQueryProvider. Only providers that implement IDbAsyncQueryProvider can be used for Entity Framework asynchronous operations.

我认为这是因为 .ToDbSet()。已经尝试使用 Task.FromResult(new List<CarSection>{ _carSection } 但 .Returns 需要 "DbSet" 而不是 "Task".

关于如何解决这个问题的任何想法?

.ToDbSet() 扩展(这个扩展来自哪个包?)似乎没有使用实现 IDbAsyncQueryProvider 的提供程序设置 IQueryable<T>.Provider 属性 .

我该如何解决?

  • 寻找可以为您执行此操作的模拟库。我不久前搬到了 EFCore,所以我不确定 EF 目前的情况如何,可能 Effort?

  • 如果您想推出自己的产品,请查看 doco from MS,它提供了随时可用的 copy/paste Moq 实施。涉及一些脚手架,但 MS 已经为您完成了艰苦的工作。您最终将创建自己的 IDbAsyncQueryProvider 实现并将其用作 DbSet<T>.

  • 的提供程序