2009-05-13 12 views
6

私はこのようになりますと、私はRhinoのモックでそれをスタブにしたいインターフェースのメソッドを持っている:Rhino Mocks:パラメータの1つがExpression <Func<T1, T2>>の場合、Stub()を使用できますか?

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

お知らせその1:スタブを行い

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

私のコードは次のようになりますそのメソッド内のパラメーターのうちの1つがExpression<Func<T1, T2>>であり、このスタブが指定された値を戻していません。私はWhenCalled()を使用してこれを行うことができますが、私はStub()が式のパラメータで動作するかどうか、あるいは私が何か間違っているかどうか疑問に思っていました。

答えて

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); 
+1

これは現在、式のメソッドでのみ機能し、プロパティでは機能しません。 Expression Matcherにプロパティマッチングを追加する必要があります。また、メソッドに引数がある場合は、それらも比較する必要があります。 – Tim

+0

重要なポイント!まだ十分に公正 - 方法のためにうまくいった。 – Jan

2

問題は、式が等価性をどのようにテストするかに関係していると思います。私はちょうどスニペットコンパイラと私の式で簡単なテストは、同じように評価しませんでした:

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

(bは、この試験のために偽だった)

おそらくあなたのテストがそのまま動作させるために、あなたを」 dは2番目のパラメータの実際の値を無視しなければなりません(受け入れられるかもしれませんが、受け入れられない場合は、私はあなたがWhenCalledルートに行く必要があると思います)。

+0

あなたのテストが証明していますこれはなぜ機能しませんが、それぞれが1つのプロパティのみを含み、同じプロパティを参照する場合、2つの式が等しいかどうかを判断できるはずです。 Rhino Mockがそれをしているようには見えませんが、もしそうなら、それは素晴らしいでしょう! –

関連する問題