2013-10-18 2 views
2

내가 함께 일하고 있어요 코드는 다음과 같이 보입니다 지정 NIL "willReturn"반환과 함께 수업을 조롱하지 내 "MyBowl"객체의 메서드는 직접이 문제와 관련없는 이유로이 방법으로 수행해야합니다.OCMockito 오히려 값보다 내가

위의 메서드 내에서 [bowl getAnOrangeWithSize]가 특정 매개 변수와 함께 호출되고 있음을 테스트하려고합니다. 여기서는 MyBowl 클래스를 모의하고 싶습니다. 위의 메서드 만 테스트합니다. 또한 [bowl getAnOrangeWithSize] 호출이 MyOrange의 모의 객체를 반환하기를 원합니다.이 예제에서는 비교 목적으로 만 사용하지만, 잠재적으로 저는 위의 메서드에서 "orange"를 사용하고있을 수도 있습니다. & 테스트를 작성하고 싶습니다. 그것도.

테스트하려면이 종속성 (MyBowl mock)을 주입하고 다른 mocked 종속성 (MyOrange)을 주입해야합니다. 이 요구 사항을 여러 번 실행하고 리팩토링하여이 문제를 해결했지만이 경우에는 막혔습니다.

어쨌든,이 시험은 다음과 같습니다 -

- (void)testThatGetAnOrangeFromBowlIsReturningAValidOrange 
{ 
    MyOrange *mockOrange = mock([MyOrange class]); 
    MyBowl *mockBowl = mock([MyBowl class]); 

    [given([mockBowl getAnOrangeWithSize:@"large"]) willReturn:mockOrange]; 
    MyOrange *returnedOrange = [sut getAnOrangeFromBowl:mockBowl withSize:@"large"]; 

    assertThat(returnedOrange, is(equalTo(mockOrange))); 
} 

테스트가 실패, returnedOrange이 전무 때문이다. 코드에 중단 점을 넣으면 "getAnOrangeWithSize"에 대한 호출이 nil을 반환한다는 것을 알 수 있습니다. 따라서 지정된 지정된/willReturn 명령을 전혀 알지 못합니다.

나는이 다양한 아이디어를 시도하면서 행운이없이 잠시 동안 내 머리를 긁적 거리는 문서 &을 검색했습니다. 테스트를 수행하는 방법이 있습니까? 아니면 OCMockito가 실제로 지원하지 않는 것입니까? 그렇다면 키위가이 문제를 처리 할 수 ​​있습니까? 미리 감사드립니다. mockOrange 내부 메소드 호출이 SUT의 코드에서 발생하는 경우

it(@"should return a valid Orange", ^{ 
    id mockOrange = [MyOrange mock]; 
    id mockBowl = [MyBowl mock]; 

    [mockBowl stub:@selector(getAnOrangeWithSize:) andReturn:mockOrange]; 

    MyOrange *returnedOrange = [sut getAnOrangeFromBowl:mockBowl withSize:@"whatever"]; 
    [[returnedOrange should] equal:mockOrange]; 
}); 

는 mockOrange가 만든 nullMock 또는 스터브로 설정 될 수있다 -이 :

편집 : 아래 그림과 같이 뉴질랜드에서이 작업을 수행하기 위해 가능한 것 그 전화를 처리합니다.

저는 키위모 (keiwi)에 매우 익숙하므로 위의 내용이 적합하지 않을 수 있습니다. 나는 또한 전달 된 특정 인자 값으로 만 작동하는 스텁을 어떻게 생성하는지 알지 못 했으므로 위의 예제를 사용하여 하나의 MyOrange 인스턴스를 반환하는 "크기가 큰"크기를 만들 수 있고, "곰팡이가 피곤하다"가 또 다른 것을 되 돌린다. 그러나 나는 그것이 어떻게되는지를 발견 할 수 없다면 다른 질문에 대한 주제라고 생각한다.

위의 키위 코드와 동일한 OCMockito/Hamcrest 코드를 여전히 알고 싶습니다. 지금은 Unanswered로 남겨 두겠습니다.

+0

'getAnOrangeFromBowl :'의 구현을 보여줄 수 있습니까? – NSAddict

+0

도움이 될까요? "MyBowl"클래스를 조롱하고 해당 메서드 호출이 반환해야하는 것을 지정합니다. 나의 이해는 MyBowl의 실제 클래스와 메서드가 사용되지 않는다는 것이며 MyBowl의 실제 구현은 관련이 없다는 것입니다. –

+0

아마도 OCMockito에 익숙하지 않은 것 같습니다. – NSAddict

답변

2

예제가 OCMockito에서 제대로 작동하므로 예제 코드가 문제가되지 않습니다.

OCMockito이 OCHamcrest가 given 메소드 인수에 대한 정합 사용 존재하지 않는 코드 것을, 나는 의심, 또는 - 그것은 다른 곳에서 코드입니다. 제공된 인수가 정규 표현자가 아닌 경우 equalTo(…) 정규 표현식에 래핑합니다.

그러나 해당 클래스가 -isEqual:을 구현하지 않으면 평등 일치가 충족되지 않습니다. 기본적으로 OCMockito는 일치하는 given 문이없는 경우에 nil을 반환합니다.

문제의 클래스가 평등을 구현해야하거나 given 문에 명시 적으로 다른 정규 표현식을 지정해야합니다. 이 경우 평등 대신 신원 확인을 위해 보통 sameInstance(…)을 사용합니다. 때로는 인수 자체가 중요하지 않은 경우도 있는데,이 경우 anything()을 사용합니다.

+0

실제로 맞습니다 - 실제 코드에서 (위에 게시 한 것은 분명히 실물 크기의 예제입니다) ** 주어진 **에서 인수를 지정하지 않은 것은 프로덕션 코드에서와 동일한 방식입니다 . 내 눈이 수십 번에 걸쳐 반짝이는 작은 실수. OCMockito 테스트가 수정되면 이제 작동합니다. 질문을하고 답변을 게시 할 시간을내어 주셔서 감사합니다.이 질문은 계시 된 모든 질문이 커뮤니티 전체에 도움이되는 것이 아니라 내 부분에 대한 실수임을 유감으로 생각합니다. 라이브로 배우기! –

+0

다른 사람들이 같은 장소에서 비틀 거리기 때문에 이것은 유용합니다. FAQ를 추가 할 수 있습니다. –