2009-05-13 32 views
6

Tôi có một phương pháp trên một giao diện trông như thế này và tôi muốn còn sơ khai nó với Rhino Mocks:Rhino Mocks: Tôi có thể sử dụng Stub() khi một trong các tham số của tôi là Biểu thức <Func<T1, T2>>?

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

Mã của tôi mà không được stubbing trông như thế này:

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

Chú ý rằng một của các tham số trong phương thức đó là Expression<Func<T1, T2>> và lệnh này không trả lại giá trị được chỉ định. Tôi biết tôi có thể làm điều này bằng cách sử dụng WhenCalled() nhưng tôi đã tự hỏi nếu Stub() nên làm việc với các thông số biểu hiện hoặc nếu tôi chỉ làm điều gì đó sai.

Trả lời

3

Bạn có thể tạo một phương pháp mà đánh giá sự bình đẳng giữa hai biểu thức:

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

Sau đó thay đổi tuyên bố cuống của bạn để quấn biểu trong một cuộc gọi đến các khớp biểu hiện:

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

Điều này hiện chỉ hoạt động cho các phương thức trong biểu thức, không phải thuộc tính. Bạn sẽ cần phải thêm thuộc tính phù hợp với Expression Matcher. Ngoài ra, nếu phương thức có đối số, bạn cũng sẽ cần so sánh các đối số đó. – Tim

+0

Điểm quan trọng! Vẫn đủ công bằng - làm việc tốt cho các phương pháp. – Jan

2

Tôi nghĩ rằng vấn đề có liên quan đến cách biểu thức kiểm tra bình đẳng. Tôi chỉ cần làm một thử nghiệm nhanh chóng trong Snippet Compiler và biểu hiện của tôi không bao giờ đánh giá là giống nhau:

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

(b là sai cho thử nghiệm này)

Có lẽ để cho thử nghiệm của bạn để làm việc như là, bạn' d phải bỏ qua giá trị thực của thông số thứ hai (có thể hoặc có thể không được chấp nhận; Nếu không thể chấp nhận được, tôi nghĩ bạn sẽ phải đi tuyến đường được đặt trước).

+0

thử nghiệm của bạn chứng tỏ tại sao điều này không hoạt động, nhưng có vẻ như bạn sẽ có thể xác định xem hai biểu thức có bằng nhau không nếu chúng chỉ chứa một thuộc tính và chúng tham chiếu đến cùng một thuộc tính. Có vẻ như Rhino Mocks không làm điều đó, nhưng sẽ tốt hơn nếu như vậy! –

Các vấn đề liên quan