我试图告诉模拟对象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/

10-11 23:15
查看更多