gpt4 book ai didi

c# - 如何从模拟对象返回 IQueryable 对象?

转载 作者:行者123 更新时间:2023-11-30 22:52:45 26 4
gpt4 key购买 nike

我正在尝试讲述一种方法 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;
}
}

我收到这个错误:

Message: System.InvalidOperationException : The provider for the source IQueryable doesn't implement IAsyncQueryProvider. Only providers that implement IEntityQueryProvider can be used for Entity Framework asynchronous operations.

我想我收到这个错误是因为 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/

26 4 0