Rhino Mocks:当我的一个参数是Expression <func <t1,t2 =“”>&gt;?</func <t1,>时,我可以使用Stub()

时间:2009-05-13 13:41:34

标签: rhino-mocks

我在接口上有一个看起来像这样的方法,我想用Rhino Mocks将它存根:

TValue GetPropertyOfExistingObject<TValue>(long id, Expression<Func<T, TValue>> propertyExpression);

执行存根的代码如下所示:

var service = MockRepository.GenerateStub<IQuoteService>();
service.Stub(s => s.GetPropertyOfExistingObject(1, q => q.QuoteNumber)).Return(1234);

请注意,该方法中的一个参数是Expression<Func<T1, T2>>,并且此存根未返回指定的值。我知道我可以通过使用WhenCalled()来做到这一点,但我想知道Stub()是否应该使用表达式参数,或者我是否只是做错了。

2 个答案:

答案 0 :(得分:3)

您可以创建一个方法来评估两个表达式之间的相等性:

public class ExpressionMatcher
{
    public static Expression<Action<T>> Matches<T>(Expression<Action<T>> action)
    {
        var methodName = ((MethodCallExpression) action.Body).Method.Name;
        return Arg<Expression<Action<T>>>.Matches(a => ((MethodCallExpression)a.Body).Method.Name.Equals(methodName));
    }
}

然后更改存根语句以在对表达式匹配器的调用中包装表达式:

service.Stub(s => s.GetPropertyOfExistingObject(Arg<int>.Is.Equal(1), ExpressionMatcher.Matches<Quote>(q => q.QuoteNumber))).Return(1234);

答案 1 :(得分:2)

我认为问题与表达式如何测试相等性有关。我刚刚在Snippet Compiler中做了一个快速测试,我的表达式从未被评估为相同:

    Expression<Func<int, string>> p = i => i.ToString();
    Expression<Func<int, string>> s = i => i.ToString();
    var b = p.Equals(s) || p == s;

(b对于此测试是假的)

可能为了让您的测试按原样运行,您必须忽略第二个参数的实际值(可能接受或不接受;如果不可接受,我认为您必须使用WhenCalled路径)