2012-06-19 3 views
1

"respondsToSelector"메소드 스텁 방법 : SynchronizerDelegate나는 이런 식으로 뭔가 할 노력하고있어

@protocol SynchronizerDelegate <NSObject> 
- (void)didLoadFullImage:(NSData *)data; 
@end 

의 정의는 다음

id synchronizerDelegate = [OCMockObject mockForProtocol:@protocol(SynchronizerDelegate)]; 
BOOL isRespondsToSelector = NO; 
[[[synchronizerDelegate stub] andReturnValue:OCMOCK_VALUE(isRespondsToSelector)] respondsToSelector:@selector(didLoadFullImage:)]; 
GHAssertFalse([synchronizerDelegate respondsToSelector:@selector(didLoadFullImage:)], nil); 

입니다에게 그러나이 테스트 케이스는 항상 (반환 값을 실패 YES입니다).

누구든지 전에 "respondsToSelector"메소드를 스텁하려고 했습니까?

답변

2

mockForProtocol의 경우 모의이 실제로 프로토콜을 따르지 않으므로 OCProtocolMockObject overrides respondsToSelector은 프로토콜에 정의 된 메서드에 대해 YES를 반환합니다.

OCMock은 개체가 호출되는 메서드를 정의하지 않을 때 런타임에 의해 호출되는 forwardInvocation:에 의존합니다. OCProtocolMockObjectrespondsToSelector을 구현하므로 모방 할 수 없습니다.

달성하려는 것을 설명하면 다른 접근 방법이있을 수 있습니다.

+1

더 자세한 설명 :

내 사양입니다 http://www.mulle-kybernetik.com/forum/viewtopic.php?f=4&t=247 –

0

이 질문은 오래되었지만 시스템 기능 (예 : iOS 8의 새 현지화 권한)을 확인하기 위해이 작업을 수행 할 때 두 코드 경로 (선택기에 응답하고 응답하지 않음)를 테스트하는 방법을 찾았습니다.). OCMock 포럼에서이 주제의

it(@"asks for location permission on viewDidLoad", ^{ 

    id locationManagerMock = OCMClassMock([CLLocationManager class]); 

    if([locationManagerMock respondsToSelector:@selector(requestWhenInUseAuthorization)]) { 
     [[locationManagerMock expect] requestWhenInUseAuthorization]; 
    } 
    else { 
     [[locationManagerMock expect] startUpdatingLocation]; 
    } 

    [sut setLocationManager:locationManagerMock]; 
    [sut view]; 

    [locationManagerMock verify]; 

}); 
관련 문제