6

次のようなインターフェースのメソッドがあり、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);

そのメソッドのパラメータの 1 つが でありExpression<Func<T1, T2>>、このスタブが指定された値を返していないことに注意してください。WhenCalled() を使用してこれを行うことができることはわかっていますが、Stub() が式パラメーターで機能する必要があるのか​​ 、それとも何か間違っているのか疑問に思っていました。

4

2 に答える 2

3

2つの式の間の同等性を評価するメソッドを作成できます。

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);
于 2009-09-10T10:37:32.280 に答える
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 は false でした)

おそらく、テストをそのまま機能させるには、2 番目のパラメーターの実際の値を無視する必要があります (これは許容される場合と許容されない場合があります。許容できない場合は、WhenCalled ルートに移動する必要があると思います)。

于 2009-05-13T13:49:52.617 に答える