Moq返回多个Linq表达式

时间:2016-02-22 22:38:22

标签: c# linq unit-testing moq

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

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表达式的问题。

非常感谢您提供的任何帮助。

1 个答案:

答案 0 :(得分:1)

您的GetAll方法接受三个参数并返回IEnumerable<TEntity>valueFunction中的Returns参数需要具有匹配的签名和返回类型。示例中的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>
        }));