我正在尝试这样做:
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但此测试用例总是失败(返回值为YES)。
以前有人尝试过存根"respondsToSelector“方法吗?
发布于 2012-06-20 01:12:19
当您使用mockForProtocol时,模拟实际上并不符合协议,因此对于协议中定义的方法,使用OCProtocolMockObject overrides respondsToSelector返回YES。
OCMock依赖于forwardInvocation:,当对象没有定义被调用的方法时,运行时会调用它。因为OCProtocolMockObject实现了respondsToSelector,所以您不能模拟它。
如果你描述你试图实现的目标,也许还有另一种方法来实现它。
发布于 2014-12-11 19:31:45
这个问题很老了,但实际上我找到了一种方法来测试两个代码路径(响应选择器,但不响应),当你这样做是为了检查系统功能(就像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];
});https://stackoverflow.com/questions/11098615
复制相似问题