2009-05-13 3 views
6

나는이처럼 보이는 인터페이스 방법을하고 난 코뿔소 모의 객체와 스텁하려면 :Rhino Mocks : 매개 변수 중 하나가 Expression <Func<T1, T2>> 일 때 스텁()을 사용할 수 있습니까?

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

공지 사항 하나를 해당 메서드의 매개 변수 중 하나가 Expression<Func<T1, T2>>이고이 스텁이 지정된 값을 반환하지 않습니다. 나는 WhenCalled()를 사용하여이 작업을 수행 할 수 있지만 Stub()이 표현 매개 변수로 작동하는지 궁금 해서요.

답변

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

가 그런 식 정규의 호출에 식을 래핑하는 스텁 문을 변경 :

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는 두 번째 매개 변수의 실제 값을 무시해야합니다 (수용 할 수도 그렇지 않을 수도 있습니다; 받아 들일 수없는 경우 나는 WhenCalled 경로를 따라야 할 것입니다).

다음 두 표현 사이의 평등을 평가하는 방법을 만들 수 있습니다
+0

귀하의 테스트 증명을 왜 이것이 작동하지 않지 만 각각 하나의 속성 만 포함하고 동일한 속성을 참조하는 경우 두식이 같은지 여부를 확인할 수 있어야합니다. Rhino Mock처럼 보이지는 않습니다.하지만 그렇게한다면 멋질 것입니다! –