2009-05-13 19 views
6

Şöyle bir arabirimde bir yöntemi var ve Rhino Mocks ile saplama istiyorum:Rhino Mocks: Parametrelerimden biri Expression <Func<T1, T2>> olduğunda Stub() kullanabilir miyim?

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

Benim kod aşağıdaki gibi görünüyor:

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

Bildirim Şunu Bu yöntemdeki parametrelerin bir Expression<Func<T1, T2>> olduğunu ve bu saplama belirtilen değeri döndürmüyor. Bunu WhenCalled() kullanarak yapabileceğimi biliyorum ama Stub() 'ın ifade parametreleriyle çalışıp çalışmadığını mı yoksa sadece yanlış bir şey yapıp yapmadığını mı merak ediyorum.

cevap

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

Sonra ifade eşleştirici bir çağrı ifadesini sarmak için saplama deyimi değiştirin:

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

Bu, şu anda yalnızca ifadedeki yöntemlerde değil, özelliklerde çalışır. İfade Eşleştiricisi'ne özellik eşlemesi eklemeniz gerekir. Ayrıca, yöntemin argümanları varsa, bunları da karşılaştırmanız gerekir. – Tim

+0

Önemli not! Hala yeterince adil - yöntemler için iyi çalıştı. – Jan

2

Sorun, İfadelerin eşitliği nasıl test ettiği ile ilgili olduğunu düşünüyorum. Sadece Pasaj Compiler hızlı bir test yaptım ve benim ifadeleri aynı şekilde değerlendirilir asla:

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

sırayla Muhtemelen

test olduğu gibi çalışması için (b Bu test için sahte idi), sen' d ikinci parametrenin gerçek değerini göz ardı etmeliyiz (kabul edilebilir veya kabul edilmeyebilir; kabul edilemezse, WhenCalled rotasına gitmelisiniz).

İki ifadeleri arasındaki eşitlik değerlendiren bir yöntem oluşturabilir
+0

Testiniz kanıtlıyor Neden bu işe yaramıyor, ama her biri tek bir özellik içeriyorsa ve aynı mülke atıfta bulunuyorlarsa iki ifadenin eşit olup olmadığını belirleyebilmeniz gerekir. Rhino Mocks'ın yaptığı gibi görünmüyor, ama yapsa güzel olurdu! –

İlgili konular