【问题标题】:how to setup mock object for dynamic linq如何为动态 linq 设置模拟对象
【发布时间】:2015-03-21 20:17:23
【问题描述】:

服务正在调用存储库函数“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());

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

请帮忙。

【问题讨论】:

  • 我让它工作 mockedWrapper .Setup(x => x.PatientPayer.GetManyIncluded( It.IsAny>>(), It.IsAny>[]>())) .Returns((Expression> expr, Expression>[] includeProperties) => appliedPatientPayers.Where(expr.Compile( )).ToList().AsQueryable());
  • 您实际上应该将您的解决方案发布为答案(如下),而不仅仅是评论。如果你不这样做,我会写它作为答案。
  • 由于某种原因我不能这样做。我的帐户被阻止回答。 :(

标签: unit-testing mocking moq repository-pattern


【解决方案1】:

重现提问者自己找到的解决方案。

当您使用Returns 的重载之一时会出现问题,该重载接收Func 委托。 Func 必须或者采用零参数(即Func&lt;TResult&gt;,其中TResult在编译时已知为IQueryable&lt;DomainObject&gt;采用与您设置的方法匹配的确切参数列表(Func&lt;T1, T2, T3, ..., Tn, TResult&gt; 其中 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()
      );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    • 2018-11-01
    • 2011-01-25
    • 2011-09-20
    相关资源
    最近更新 更多