首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何存根"respondsToSelector“方法

如何存根"respondsToSelector“方法
EN

Stack Overflow用户
提问于 2012-06-19 17:56:27
回答 2查看 1.4K关注 0票数 1

我正在尝试这样做:

代码语言:javascript
复制
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的定义

代码语言:javascript
复制
@protocol SynchronizerDelegate <NSObject>
- (void)didLoadFullImage:(NSData *)data;
@end

但此测试用例总是失败(返回值为YES)。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-20 01:12:19

当您使用mockForProtocol时,模拟实际上并不符合协议,因此对于协议中定义的方法,使用OCProtocolMockObject overrides respondsToSelector返回YES。

OCMock依赖于forwardInvocation:,当对象没有定义被调用的方法时,运行时会调用它。因为OCProtocolMockObject实现了respondsToSelector,所以您不能模拟它。

如果你描述你试图实现的目标,也许还有另一种方法来实现它。

票数 2
EN

Stack Overflow用户

发布于 2014-12-11 19:31:45

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

这是我的规格:

代码语言:javascript
复制
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];

});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11098615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档