Moq 模拟带有表达式参数的函数

Moq mocking a function with expression parameters

我在 IRepository 中模拟一个函数时遇到问题,需要有关准确模拟该函数的代码的帮助

我尝试在 Moq 中为 It 对象中的任何参数模拟函数,但无法解析

这是我的 IRepository 接口中 ListAsync 的函数声明,我需要使用 where 和 include 参数模拟第二个函数声明

Task<IEnumerable<TEntity>> ListAsync(params Expression<Func<TEntity, object>>[] include);

Task<IEnumerable<TEntity>> ListAsync(Expression<Func<TEntity, bool>> where, params Expression<Func<TEntity, object>>[] include);

函数调用如下:

var result = await _unitOfWork.XXXRepository.ListAsync(p => p.clientId == clientId);

我试过的代码是:

_unitOfWork.Setup(x => x.XXXRepository.ListAsync(p => It.IsAny<Expression<Func<XXX, bool>>>())).ReturnsAsync(XXXs.AsEnumerable());

_unitOfWork.Setup(x => x.XXXRepository.ListAsync(p => Id == id)).ReturnsAsync(XXXs.AsEnumerable());

_unitOfWork.Setup(x => x.XXXRepository.ListAsync(p => p.Id == 1)).ReturnsAsync(XXXs.AsEnumerable());

有趣的是,最后一个解决方案 p=>p.Id ==1 在实际函数代码类似于 Where(p=>p.Id ==1) 时有效,但当我在实际函数中获取 id 作为参数时它不起作用,如 [=18] =]

我的意思是我手动准备数据 return 其中有 6 个项目并且无法从模拟函数 returning 结果中获取任何列表项

有解决方案吗?

如果你想模拟第二个重载,你应该可以这样做:

_unitOfWork
    .Setup(x => x.XXXRepository.ListAsync(
        It.IsAny<Expression<Func<XXX, bool>>>(),
        It.IsAny<Expression<Func<XXX, object>>[]>()))
    .ReturnsAsync(XXXs.AsEnumerable());