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>
.
的提供程序
我有这个最小起订量设置:
_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 implementIDbAsyncQueryProvider
. Only providers that implementIDbAsyncQueryProvider
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>
. 的提供程序