2014-02-28 8 views
0

내가 다음을 수행 OCMock 사용하여 테스트 케이스가 제대로 중지되지 않습니다OCMock : 조롱 프로토콜은

CAAOAuth2AuthenticationManager *oAuth2AuthManager = [[CAAOAuth2AuthenticationManager alloc] init]; 
id authDelegate = [OCMockObject mockForProtocol:@protocol(CAAAuthenticationDelegate)]; 
id partialAuthManagerMock = [OCMockObject partialMockForObject:oAuth2AuthManager]; 
id resultMock = [OCMockObject mockForClass:[CAAOAuth2AuthenticationResult class]]; 
[[authDelegate reject] didFailWithError:OCMOCK_ANY]; 

[[[partialAuthManagerMock expect] andForwardToRealObject] authenticateWithResult:OCMOCK_ANY formData:OCMOCK_ANY delegate:authDelegate]; 
[[partialAuthManagerMock reject] authenticateWithOptions:OCMOCK_ANY delegate:authDelegate]; 

[[[resultMock expect] andReturnValue:OCMOCK_VALUE(YES) ] isAuthenticated]; 
[[resultMock reject] refreshToken]; 

내가 테스트 케이스를 실행, 두 번째 테스트 케이스 (완전히 다른 테스트 클래스와 파일) 내가 두 번째 테스트 케이스의 모든 모의 객체를 사용하지 않는,

2014-02-28 10:11:24.594 otest[37161:303] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'OCMockObject[CAAAuthenticationDelegate]: unexpected method invoked: didReceiveAuthenticationWithResult:OCMockObject[CAAOAuth2AuthenticationResult] 
stubbed: didFailWithError:<OCMAnyConstraint: 0xa913fc0>' 

을하지만 : 어떤 또한 CAAAuthenticationDelegate 프로토콜을 사용 SIGABRT와 함께 실패합니다. stopMocking으로 모의를 치우려고했지만 성공하지 못했습니다.

다음 모의 설치는 아무 문제없이 작동합니다 이런 이유

[[authDelegate reject] didFailWithError:OCMOCK_ANY]; 

[[[partialAuthManagerMock expect] andForwardToRealObject] authenticateWithResult:OCMOCK_ANY formData:OCMOCK_ANY delegate:authDelegate]; 
[[partialAuthManagerMock expect] authenticateWithOptions:OCMOCK_ANY delegate:authDelegate]; 

[[[resultMock expect] andReturnValue:OCMOCK_VALUE(NO) ] isAuthenticated]; 
[[[resultMock expect] andReturn:refreshToken] refreshToken]; 

은 누군가가 말해 줄래?

+1

예외가 발생했을 때 전체 스택 추적은 무엇입니까? 당신은 어딘가에 메모리에 매달려 매달려 떠났어. 그것은 아마도 여러분의 andForwardToRealObject 일 것입니다. 이것은 테스트가 끝난 후에 메모리에 잠글 수있는 비동기 활동을하는 것입니까? – ImHuntingWabbits

답변

0

해결 방법으로 프로토콜의 빈 구현을 만든 다음 실제 개체를 조롱 할 수 있습니까? 그 방법으로 운이 좋았습니다. 프로토콜을 조롱하면 나에게 위안이 될뿐입니다.

@interface TestAuthDelegateImpl : NSObject <CAAAuthenticationDelegate> 
@end 
@implementation 
- (void)didFailWithError:(id)whatever; 
@end 

이런 식으로. 그럼 그냥 mockForClass로하면 더 잘 행동 할 수 있습니다.

0

CAAOAuth2AuthenticationManager 인스턴스가 나중의 테스트에서 여전히 사용 중이며 여전히 모의 위임이 설정되어 있고 일부 메소드가 호출되어 위임 메소드가 호출되는 것을 의미합니다. CAAOAuth2AuthenticationManager는 싱글 톤 유형의 객체입니까, 아니면 두 번째 테스트에서 사용 된 인스턴스입니까? 완료 될 때 첫 번째 테스트의 인증 관리자에서 대리인을 무효로 재설정합니다.

niceMockForProtocol을 사용할 수도 있습니다. 그러면 niceMockForProtocol이 명시 적 거부 설정이없는 메소드 호출을 자동으로 무시합니다. 예외에 의해 거부가 제거 된 것처럼 들리므로 델리게이트 모의는 예상 된 것이 없으므로 델리게이트 모의는 예외를 던지게됩니다.

또한 실제 코드를 실제 호출 할 때 STAssertNoThrow()를 사용합니다 (실제 위의 설정 이후에 발생합니다). 거부 및 예기치 않은 메서드는 예외를 발생시켜 모의 개체가 제대로 할당 취소되지 않고 이후 테스트에 문제가 발생할 수 있습니다. 문제의 테스트가 통과 된 경우 여기에는 문제가되지 않습니다.

확인할 사항은 위임 속성이 "weak"대신 "assign"으로 선언 된 경우입니다. 그것이 "할당"되어 있고 그것을 없애지 않고 해제하면 아무 일도 일어나지 않을 것입니다 (segfault 또는 전혀 새로운 객체가 동일한 메모리 주소에 할당 됨). 그것도 여기에있을 것 같지 않습니다.