2009-05-13 5 views
6

J'ai une méthode sur une interface qui ressemble à ceci et je veux le bouchonner avec Rhino Mocks:Rhino Mocks: Puis-je utiliser Stub() lorsque l'un de mes paramètres est Expression <Func<T1, T2>>?

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

Mon code qui fait le stubbing ressemble à ceci:

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

Notez que l'un des paramètres de cette méthode est un Expression<Func<T1, T2>>, et ce stub ne renvoie pas la valeur spécifiée. Je sais que je peux le faire en utilisant WhenCalled() mais je me demandais si Stub() devrait fonctionner avec des paramètres d'expression ou si je fais juste quelque chose de mal.

Répondre

3

Vous pouvez créer une méthode qui permet d'évaluer l'égalité entre les deux expressions:

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)); 
    } 
} 

Changez ensuite votre déclaration de talon pour envelopper l'expression dans un appel à l'expression matcher:

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

Cela ne fonctionne actuellement que pour les méthodes de l'expression, pas les propriétés. Vous devez ajouter une propriété correspondant à Expression Matcher. En outre, si la méthode a des arguments, vous devrez également les comparer. – Tim

+0

Point important! Toujours juste - bien travaillé pour les méthodes. – Jan

2

Je pense que le problème est lié à la façon dont les expressions testent l'égalité. Je viens de faire un test rapide dans Snippet Compiler et mes expressions jamais évaluée comme le même:

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

(b était faux pour ce test)

probablement pour que votre test fonctionne tel quel, vous d avoir à ignorer la valeur réelle du second paramètre (qui peut être acceptable ou non, sinon je pense que vous devrez suivre la route WhenCalled).

+0

Votre test prouve pourquoi cela ne fonctionne pas, mais il semble que vous devriez être capable de déterminer si deux expressions sont égales si elles contiennent chacune une seule propriété et qu'elles font référence à la même propriété. Ne ressemble pas à Rhino Mocks, mais ce serait bien si c'était le cas! –

Questions connexes