2010-01-13 3 views
10

RhinoMock 사용 - 호출 된 함수의 매개 변수를 가져올 수 있습니까? 내말은; 함수 호출에서 알 수없는 매개 변수를 일부 가져올 수 있습니까?RhinoMocks - 호출 된 함수의 매개 변수 가져 오기

나는 모의가 있으며, 이것에 대해 몇 가지 기능을 호출 할 것으로 기대합니다. 나는 매개 변수 중 하나를 알고 있지만 다른 하나는 모의 (mock)를 사용하는 클래스에서 유래하고 모의 함수를 호출하기 때문에 알려지지 않았습니다. 보다 구체적으로 -이 경우 - 알려지지 않은 인수는 람다 함수입니다. 이것은 함수가 끝날 때 호출 될 콜백 함수입니다. mock이 콜백을 호출하지 못하도록하므로 콜백을 가져 와서 직접 호출하려고합니다.

그래서; 함수가 호출되었는지 확인하고 싶습니다. 인수의 일부가 예상 된 것인지 확인하고 싶습니다. 그리고 나중에 그들에 대한 조작을하기 위해 알려지지 않은 주장을 꺼내기를 원합니다.

int unknownInt; 
_fakeSomething.AssertWasCalled(factory => factory.Foo(1, out unknownInt)); 
// then play around with unknownInt.. 

가이 작업을 수행 할 수 있습니다

가정 인수 모두 (단순성)의 int이다 나는 같은 것을 할 싶습니다? 나는 Arg.Out이 있다는 것을 알고 있지만, 제대로 작동하지는 못합니다.

참고 : 오해의 소지가있는 것으로 보인 질문이 업데이트되었습니다.

답변

14
Arg<string>.Matches(arg => you got the argument here...); 

UPDATE :

_fakeSomethingFoo 방법의 첫 번째 호출에 만든 두 번째 인수를 가져 : 당신과 함께 동의하지 않는

string someArg = null; 
var args = _fakeSomething.GetArgumentsForCallsMadeOn(
    x => x.Foo(0, 0), 
    x => x.IgnoreArguments() 
); 
var int = (int)args[0][1]; 
+0

감사합니다. 하지만 내가 알기로 이것은 보통의 일치인가? 또는 인수를 가져 오는 데이 코드를 사용할 수 있습니까? 나는 그 논쟁을 꺼내고 싶다. 내 질문이 오도 될 수도 있으므로 질문 문안을 업데이트했습니다. – stiank81

+0

이제는 더 명확 해졌습니다. 내 업데이트를 참조하십시오. –

+0

그게 다야! 감사! – stiank81

0

확실하지 그것을 수행 할 수 있습니다,하지만 당신이 전달 된 실제 있었던 파라미터를 모르는 것처럼 그런 식으로 테스트하는 것은, 신뢰할 수없는 시험을 초래할 수있는 경우.

가능하면 테스트를 명시 적 데이터. f.eks가 실제 값 대신에 null을 전달하면 테스트가 잘못된 이유로 통과 할 것입니다.

Arg.Is를 사용한 테스트는 AssertWasNotCalled와 같이 매개 변수를 신경 쓰지 않고 신중하게 수행해야합니다.

+0

. 한 가지 예를 들자면 모의 서비스 프록시가 있습니다. 나는 그것을 사용할 어떤 클래스의 foo 객체를 생성 할 때이 서비스 프록시를 삽입한다. 그런 다음 객체 foo에 대한 함수를 호출합니다.이 함수가 기대하는 몇 가지 인수로 서비스 프록시 모의 함수를 호출하고 클래스에 비공개 인 콜백 함수를 호출 할 것으로 기대합니다. 이제 함수가 예상 된 인수로 호출되었는지 확인하고 싶지만 개인용 콜백을 확인할 수 없으므로 Arg.Is.Anything을 지정하십시오. 나는 그 주장에 관심이 없다. 그래서 나는 왜 안되는가? – stiank81

+1

아하이 봐요. 콜백과 람다를 테스트하는 데 몇 가지 문제가있었습니다. 나는 나의 디자인이 잘못되었다는 결론에 도달했다. 테스팅에 대한 아름다운 점, 특히 TDD는 디자인이 잘못되었을 때 알려주는 것입니다. 디자인이 잘못 되었든 말든 당신에게 말할 수는 없지만, 당신의 코드를 테스트하기가 어렵다면 디자인을 재고해야합니다. – Henning

관련 문제