如何为动态linq设置模拟对象

时间:2015-01-22 21:22:30

标签: unit-testing mocking moq repository-pattern

服务正在调用存储库函数“GetManyIncluded”,其具有如下所述的签名

     IQueryable<T> GetManyIncluded(Expression<Func<T, bool>> where, params Expression<Func<T, object>>[] children);

在测试方法中,我正如下面提到的那样设置

            mockedWrapper.Setup(x => x.DomainObject.GetManyIncluded(It.IsAny<Expression<Func<DomainObject, bool>>>(), It.IsAny<Expression<Func<DomainObject, object>>[]>())).Returns<Expression<Func<DomainObject, bool>>>(expr => listOFObjects.Where(expr.Compile()).ToList().AsQueryable());

这给了我服务中的参数计数不匹配异常。

请帮忙。

1 个答案:

答案 0 :(得分:0)

再次提出解决方案,提问者发现了自己。

当您使用Returns的一个重载时,会出现问题,该重载会引入Func委托。 Func必须 取零参数(即Func<TResult>,其中TResult在编译时已知为IQueryable<DomainObject> 获取与您设置的方法匹配的完整参数列表(Func<T1, T2, T3, ..., Tn, TResult>其中 n T与模拟方法的参数列表完全匹配)

您尝试使用模拟方法中的参数子集,但这是不允许的(将在没有错误的情况下执行Setup,但在模拟器上调用方法时将失败并出现参数计数不匹配异常对象)。

因此解决方案是:

  mockedWrapper
    .Setup(x => x.DomainObject.GetManyIncluded(
      It.IsAny<Expression<Func<DomainObject, bool>>>(),
      It.IsAny<Expression<Func<DomainObject, object>>[]>()
      ))
    .Returns(
          (
          Expression<Func<DomainObject, bool>> where,
          Expression<Func<DomainObject, object>>[] children
          )
            => listOFObjects.Where(where.Compile()).ToList().AsQueryable()
      );