문제

다른 개체에 대한 생성자 인수로 전달되는 조롱 된 물체가 있습니다.

조롱 된 물체의 속성이 호출되었음을 어떻게 테스트 할 수 있습니까? 이것은 내가 현재 사용하고있는 코드입니다.

INewContactAttributes newContact = MockRepository.GenerateMock<INewContactAttributes>();
newContact.Stub(x => x.Forenames).Return("One Two Three");
someobject.ConsumeContact(newContact);
newContact.AssertWasCalled(x => { var dummy = x.Forenames; });

이것은 "someobject"내에서 예측 속성의 Getter가 여러 번 사용되는 경우를 제외하고는 작동합니다. 그때 "rhino.mocks.exceptions.expectationViolationException : inewcontactattributes.get_forenames (); 예상 #1, 실제 #2 .."

간단히 사용합니다

newContact.AssertWasCalled(x => { var dummy = x.Forenames; }, options => options.Repeat.Any());

작동하지 않으며 아래 오류를 제공합니다.

"기다리는 기대 목록에서 기대가 제거되었고, 반복 ()를 호출 했습니까?

그렇다면 여러 통화를 어떻게 충족합니까?

도움이 되었습니까?

해결책

newContact.AssertWasCalled(x => { var dummy = x.Forenames; }, options => options.Repeat.AtLeastOnce());

Repeat.Any 함께 작동하지 않습니다 AssertWasCalled 0이라도 계산되기 때문에 ... 호출되지 않은 경우 AsserWasCalled 호출되지 않더라도 사실이 되돌아 갈 것입니다.

다른 팁

Chris Answer에 동의합니다

newContact.AssertWasCalled(x => { var dummy = x.Forenames; }, options => options.Repeat.AtLeastOnce());

또한 부동산이 몇 번이나 호출되는지 정확히 알고 있다면 할 수 있습니다.

newContact.AssertWasCalled(x => { var dummy = x.Forenames; }, options => options.Repeat.Times(n));

여기서 n은 int입니다.

호출되는 횟수를 확인하는 동기는 무엇입니까? 특히 비싼 작업입니까? 그렇다면 의미 적으로 말하면 속성이 저렴한 호출이어야하는 방법으로 방법 뒤에 놓을 것을 제안합니다.

또한, 부동산이 호텔이라고 불리는 횟수를 확인하는 것은 단위 테스트의 추력이 아닙니다 (너무 많은 테스트를하는 것은 일반적인 실수라고 걱정하지 마십시오. 우리 모두가 거기에있었습니다). 실제로 테스트해야 할 것은 모의 객체의 상태를 감안할 때 메소드가 예상 출력을 생성한다는 것입니다. 메소드가 호출되는 횟수는 실제로 중요하지 않습니다 (이메일이나 무언가를 보내는 서비스가 아니라면). 간단한 리팩터가 테스트가 너무 구체적이므로 테스트를 중단 할 수 있으므로 일반적으로 테스트하지 않는 구현 세부 사항입니다.

사용중인 Rhino 버전에 따라 다음을 사용할 수 있습니다.

// Call to mock object here
LastCall.IgnoreArguments().Repeat.Never();

newContact.expect (c => c.forenames) .return (...) .repeat.any ()

에서 여기:

mock.AssertWasCalled(x => x.Name ="Bob");

또는

mock.AssertWasCalled(x => x.Name =Arg.Is("Bob"));

또는

mock.AssertWasCalled(x => x.Name =Arg<string>.Is.NotNull);
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top