2016-06-03 4 views
0

iOS 프로젝트에서 단위 테스트를 수행하기 위해 OCMock 3을 사용하고 있습니다.테스트중인 함수에 전달 된 인수의 실제 값을 무시하는 방법

는 단순히 함수가 인수 값이에 전달되는 관련된없이 를 호출되어 있는지 확인하려면

예를 들어, 내가 호출 다음과 같은 기능을 확인하려면 :.

[school startTime:currentTime]; 

(짧은 참고 사항 : 학교 수업의 기능은 -(void)startTime:(long long)입니다.

내 테스트 케이스에서 시도 :

OCMVerify([schoolMock startTime:(long long)[OCMArg any]]); 

나는 테스트중인 코드가 호출되었습니다 확신합니다,하지만 난 오류 얻을 : OCMockObject(School):Method startTime:2005634354 was not invoked을.

OCMock이 함수에 전달 된 인수의 정확한 값을 여전히 확인하고있는 것처럼 보입니다. 왜? 테스트가 기대하는 이유

+0

'startTime :'메소드에 중단 점을 넣어 호출되는지 확인하십시오. – stevekohls

+0

@stevekohls, 그랬습니다. –

+0

중단 점에 도달하면 호출 인스턴스를 기록하여 실제 구현이 아닌 모의 객체인지 확인합니다. –

답변

0

(long long) 인 유형 [OCMArg any]에서 캐스트는 매개 변수로되는 값 2005634354,에 OCMock 객체를 변환합니다. startTime[OCMArg any]에 대해 지원되지 않는 개체가 아닌 인수를 필요로합니다. long long으로 캐스트를 제거하면 컴파일러 경고가 표시됩니다.

대신,이에 검증을 변경 startTime에 의해 예상되는 비 객체 인수가 완전히 무시됩니다

OCMVerify([[schoolMock ignoringNonObjectArgs] startTime:0]); 

ignoringNonObjectArgs은 이름이 의미하는 것처럼 할 것입니다. 평소에는 0을 사용하여 일관된 자리 표시 자 값을 얻지 만 이론적으로는 long long을 검증에 넣을 수 있으며 모의 객체에 의해 메서드가 호출되는 한이 메서드는 통과합니다.

+0

당신의 답을 시도했지만, 이제'Method startTime : 0 was invoked'라는 에러가 발생합니다. 이 코드 줄에 중단 점을 추가했습니다. 나는 조롱 된 학교 인스턴스를 호출하고 있다고 확신합니다. –

0

OCMock 문서는 이것에 대해 매우 분명합니다. "개체 나 포인터 또는 선택기가 아닌 인수는 모든 자리 표시자를 사용하여 무시할 수 없습니다." (Section 4.1).