2010-01-04 4 views
6

Rhinomocks를 사용하여 Mock/Stub이 전혀 호출되지 않았다는 것을 어떻게 확인할 수 있습니까? Mock/Stub에서 메소드가 호출되지 않았습니까?Rhinomocks, 스텁/모의이 전혀 호출되지 않았 음을 확인하는 방법은 무엇입니까?

저는 AssertWasNotCalled 메서드를 알고 있지만이 메서드는 메서드 이름을 언급해야합니다. (아마 내가 부를 수있는 10 개의 다른 메소드를 가진 클래스가있다.)

Log.AssertWasNotCalled(x => x.LogAndReportException(null, null), x => x.IgnoreArguments()); 

답변

1

당신은 엄격한 모의를 만들 StrictMock 방법을 사용할 수 있습니다 - 어떤 unexcepted 메서드 호출을 사용하는 경우이 오류가 발생합니다. Ayende's site에 따르면, 이것은 권장하지 않지만 유용하다고 생각되는 시나리오와 똑같습니다.

1

모의 (mock)를 사용하는 경우 모든 단일 호출이 수행되었는지 여부를 주장해서는 안됩니다. 이는 특정 구현에 대한 테스트를 결합하여 취약하게 만들고 리팩터링 악몽으로 만듭니다.

내가 이런 상황에 빠진 적이 있다면 왜 내가 의존성이 사용되지 않았다고 주장하고 싶었는지 다시 생각해 보겠다.

분명히 종속성이 어디에서도 사용되지 않으면 제거하십시오. 일부 작업에 필요하지만 종속성의 모든 작업이 파괴적인 작업이고 일부 작업이 해당 작업과 관련되지 않도록하려면 명시 적으로 파괴 작업이 호출되지 않았고 구현에서 수행하도록 허용해야합니다 비파괴적인 작업 (원하는 경우)이 있으면 원하는대로 할 수 있습니다. 이렇게하면 테스트가보다 명확하고 취약하지 않게됩니다. 이 미래에 사라질 수있는 기능입니다 althought

+0

+1 일반적으로 허약 한 테스트의 경우 동의합니다. 그러나 이것은 유효한 요청 일 수 있습니다. Method Injection과의 인터페이스를 상상해보십시오. 인터페이스의 메소드는 주입 된 추상 매개 변수를 사용하므로 무언가를 제공해야합니다. 이제 그 인터페이스의 '널 (null)'구현을 작성 중이며 주입 된 매개 변수 (인터페이스로 인해 있어야 함)가 사용되지 않는다는 요구 사항이 있다고 가정하십시오. 틈새 시나리오의 비트, 나는 인정하지만 여전히 관련이 있습니다 :) –

+0

@ 마크 : 예, 그것은 용납 될만한 사용법입니다. 유용 할 수있는 코너 케이스가 있다는 것을 알았습니다. –

+1

가드 절에 대한 단위 테스트는 메서드 내부의 종속성이 호출되지 않도록하는 좋은 위치입니까? 나는 현재 가드 절이 의도 한대로 기능하고 모의이 호출되지 않도록하려는 시나리오에 대한 단위 테스트를 작성하고 있습니다. – Maslow

6

당신은 엄격한 모의를 사용할 수 있습니다

var mocks = new MockRepository(); 
var cm = mocks.StrictMock<ICallMonitor>(); 
cm.Replay(); 

cm.HangUp(); // this will cause VerifyAllExpectations to throw 
cm.VerifyAllExpectations(); 

을이 구문에서이하는 스트릭 모의 명시 적으로 정의 된 통화를 할 수 있습니다.

+0

올바르게 이해한다면,이 시나리오에서는'Replay'와'HangUp' 둘 다 검증을 던지지 않을 것입니다. – Maslow

+2

@Maslow : 아니요. 'Replay'는 모의를 재생 모드에 놓는 Rhino Mock 확장 메소드입니다. 녹음 모드에 들어가기 전에 녹음 된 통화가 기록되지 않았습니다. 재생 모드로 들어가면 정확히 허용됩니다. 호출 할 수 없습니다. –

+0

아, 확장 메서드가 없거나 다른 버전에서 가져온 것이 아니라면, 내 코드에서 'mocks.Replay (cm);'였고'mocks.VerifyAll();' – Maslow

관련 문제