我试图告诉模拟对象GetAll()
上的方法_portalUserRepositoryMock
返回类型为IQueryable<TEntity>
的对象。我知道它是这种类型的,因为要测试的类中的方法会返回这种类型。
我无法提出解决方案。
我看到了这个post,但是在尝试将library包含到我的项目中时出错。有关Microsoft.EntityFrameworkCore版本的信息-导致了更多问题。
我得到此错误的方法是:
_portalUserRepositoryMock = Substitute.For<IPortalUserRepository>();
_portalUserRepositoryMock.GetAll().Returns(fakeQueryablePUser.AsQueryable());
被测类使用如下存储库:
var portal = await _portalUserRepository.GetAll().Include(p =>
p.Portal).Where(p => p.UserId == user.Id && p.Portal.PortalType ==
dto.PortalType).FirstOrDefaultAsync();
GetAll()
方法是: public IQueryable<TEntity> GetAll()
{
try
{
return DbContext.Set<TEntity>().AsNoTracking();
}
catch (Exception ex)
{
throw ex;
}
}
我收到此错误:
消息:System.InvalidOperationException:源的提供程序
IQueryable没有实现IAsyncQueryProvider。仅提供者
实现IEntityQueryProvider可用于实体框架
异步操作。
我估计由于正在使用
FirstOrDefaultAsync()
而收到此错误。只是不知道如何解决它。编辑:
现在,我已经能够将MockQueryable库添加到我的测试项目中(通过使用版本1.0.4而不是最新的1.1.0)。我已按照以下步骤操作,如下所示:
var fakePortalUser = new PortalUser()
{
PortalId = new Guid()
};
var fakeQueryablePUser = new List<PortalUser>
{
fakePortalUser
}.AsQueryable().BuildMock();
现在的最后一步是使用
GetQueryable()
。我尝试在这里使用:_portalUserRepositoryMock.GetAll().GetQueryable().Returns(fakeQueryablePUser);
但是我在
GetQueryable()
方法调用下得到了红色的弯曲线。因此代码将无法编译。 最佳答案
最初的问题是您怀疑与FirstOrDefaultAsync
有关。该扩展期望可查询对象也具有IAsyncQueryProvider
以便匹配默认情况下模拟的异步EF。
删除.GetQueryable()
,因为您不需要它。该成员来自其中一个示例,以演示如何使用模拟库。
还要确保假数据中包含与Where
中的谓词匹配的数据。
.Where(p => p.UserId == user.Id && p.Portal.PortalType == dto.PortalType)
如果没有要枚举的元素,
FirstOrDefault
将返回null。如果数据不满足过滤条件,则默认情况下您将返回null。
关于c# - 如何从模拟对象返回IQueryable <TEntity>对象?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57807702/