Moq Returns 具有多个 Linq 表达式

Moq Returns with multiple Linq Expressions

我在尝试模拟的存储库中有以下方法:

IEnumerable<TEntity> GetAll(
      Expression<Func<TEntity, bool>> filter = null,
      Func<IQueryable<TEntity>, IOrderedQueryable<TEntity>> orderBy = null,
      string includeProperties = "")

我设置了以下内容:

mockContactNumberRepository.Setup(x => x.GetAll(
    It.IsAny<Expression<Func<ContactNumber, bool>>>(), 
    It.IsAny<Func<IQueryable<ContactNumber>, IOrderedQueryable<ContactNumber>>>(),
    It.IsAny<string>()))
    .Returns(new Func<Expression<Func<ContactNumber, bool>>, 
        IQueryable<ContactNumber>>(ex => _contactNumbers.Where(ex.Compile()).AsQueryable()));

当 运行 单元测试时,我收到有关参数计数不匹配的错误消息。我知道这是因为 Returns 仅指定了第一个参数,但我不确定如何指定更多参数。

我发现了很多提出类似问题的问题,但没有找到一个包含多个 lambda 表达式的问题。

如能提供任何帮助,我们将不胜感激。

您的 GetAll 方法采用三个参数并且 return 是一个 IEnumerable<TEntity>Returns 中的 valueFunction 参数需要具有匹配的签名和 return 类型。您示例中的 valueFunction 参数只有两个输入参数,第二个参数与传递给 GetAll 的任何参数类型都不匹配。它应该看起来像这样(我没有受益于编译器检查我的语法,但我认为我在这里的内容应该是正确的):

mockContactNumberRepository
.Setup(x => 
    x
    .GetAll(
        It.IsAny<Expression<Func<ContactNumber, bool>>>(), 
        It.IsAny<Func<IQueryable<ContactNumber>, IOrderedQueryable<ContactNumber>>>(),
        It.IsAny<string>()))
.Returns(new Func<
    Expression<Func<ContactNumber, bool>>, 
    Func<IQueryable<ContactNumber>, IOrderedQueryable<ContactNumber>>,
    string,
    IEnumerable<TEntity>>((arg1, arg2, arg3) => 
        {
            // arg1 is Expression<Func<ContactNumber, bool>>
            // arg2 is Func<IQueryable<ContactNumber>, IOrderedQueryable<ContactNumber>>
            // arg3 is string
            // Do something here and return an IEnumerable<TEntity>
        }));