Iphone “如何存根”;响应选择器“;方法

Iphone “如何存根”;响应选择器“;方法,iphone,objective-c,ios5,ocmock,Iphone,Objective C,Ios5,Ocmock,我正在尝试这样做: id synchronizerDelegate = [OCMockObject mockForProtocol:@protocol(SynchronizerDelegate)]; BOOL isRespondsToSelector = NO; [[[synchronizerDelegate stub] andReturnValue:OCMOCK_VALUE(isRespondsToSelector)] respondsToSelector:@selector(didLoadF

我正在尝试这样做:

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

@protocol SynchronizerDelegate <NSObject>
- (void)didLoadFullImage:(NSData *)data;
@end
@protocolsynchronizerdelegate
-(void)didLoadFullImage:(NSData*)数据;
@结束
但是这个测试用例总是失败(返回值为YES)


以前有人尝试过存根“respondsToSelector”方法吗?

当您mockForProtocol时,mock实际上不符合协议,因此要为协议中定义的方法返回YES

OCMock依赖于
forwardInvocation:
,当对象尚未定义要调用的方法时,运行时将调用该调用。由于
OCProtocolMockObject
实现了
respondsToSelector
,因此不能对其进行模拟


如果您描述了您试图实现的目标,可能还有另一种方法。

这个问题很老了,但实际上我找到了一种方法来测试两个代码路径(响应选择器而不响应),当您这样做以检查系统功能(如iOS 8中的新本地化权限)时

这是我的规格:

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];

});

在OCMock论坛上对此主题进行更详细的讨论: