检查Moq中安装程序的表达式输入参数

时间:2014-01-14 15:23:28

标签: c# moq

我想要Moq一个看起来像这样的方法:

OrderAttrTypeRepository.Get(attributeType => attributeType.Description == property.Key);

我想根据property.Key

比较这个方法的调用参数

我正在尝试这个:

 Expression<Func<OrderAttrType, bool>> saveObject;
 Expression<Func<OrderAttrType, bool>> criteria = y => y.Description == "ServiceCharge";
 Mock.Setup(x => x.OrderAttrTypeRepository.Get(It.IsAny<Expression<Func<OrderAttrType, bool>>>()))
 .Callback<Expression<Func<OrderAttrType, bool>>>(i => saveObject = i)
 .Returns<Expression<Func<OrderAttrType, bool>>>(filter =>
  {
   if (Utility.ExpressionComparer.AreEqual(filter, criteria))
      return "Whatever";
   else
      return null;
  })

但是,当我运行测试时,我总是得到一个null。即使使用property.key =“ServiceCharge”调用该方法。

在saveObject对象中,表达式主体如下所示:

attributeType.Description == value(Quipu.Eba.Service.UtilityPaymentService+<>c__DisplayClass53).property.Key)

这就是为什么不评估表达式的原因,因为它们是相同的。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

我现在回答自己,我发现了问题。

property.Key是一个变量,因此,当作为表达式求值时,它会转换为value(Quipu.Eba.Service.UtilityPaymentService+<>c__DisplayClass53).property.Key)

如果property.key是一个值为"ServiceCharge"的常量字符串,那么它将按预期变换为常量的值,我将能够比较表达式。

所以,我将不得不以另一种方式关注问题,因为,无论变量property.key的值是什么,它总是转换为它们的引用而不是值,这意味着,据我所知,我无法区分表达方式。