ios - 使用 OCMock 期待来自非实例化变量的方法调用

标签 ios objective-c xcode ocmock

我不确定这是否是最好的标题,但基本上我知道变量将在运行函数时实例化。我想对此变量进行部分模拟,并期望在实例化变量之前调用某些方法。这是我正在尝试做的事情的示例。

-(void)testMethod {
    id mockVar = [OCMock partialMockForObject:self.controller.variable];
    [[mockVar expect] someMethod];

    [self.controller method];
    [mockVar verify];
}

Controller 内的方法将类似于:

-(void)method {
    self.variable = [[Class alloc]init];
    [self.variable someMethod];
}

我收到类似“doesNotRecognizeSelector”的消息。这可能吗?

最佳答案

如果可以 stub 属性访问器,我会这样做。但是,如果您需要部分模拟由真实代码实际创建的实例,则可以将其存储在属性上(setter 方法成为 Hook ),但这绝对是丑陋的。

基本思想是使用 OCMArg 的 checkWithBlock: 功能来拦截 set 方法的参数,并在此时创建部分模拟。您可以将其分配给 block 外的变量以供稍后验证。它看起来像这样:

-(void)testMethod
{
    id mockController = [OCMockObject partialMockForObject:self.controller];
    __block id mockVar;

    [[[mockController stub] andForwardToRealObject] setVariable:[OCMArg checkWithBlock:^BOOL(id param) {
        mockVar = [OCMockObject partialMockForObject:param];
        [[mockVar expect] someMethod];
        return YES;
    }]];

    [self.controller method];  // mockVar will be created and assigned during this call
    [mockVar verify];
}

如果您的真实代码创建了一个对象并仅将其临时存储在局部变量(而不是实例变量)中,那么除了重组您的真实代码以使其更易于测试(例如移动将对象创建到新方法中的代码,这使得 stub 更容易)。

关于ios - 使用 OCMock 期待来自非实例化变量的方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19280045/

相关文章:

ios - 从数组索引 obj c 加载某些信息

iphone - iOS——有没有类似 CGContextSetLineDash 的路径?

ios - Storyboard设计模式(分享或不分享)

objective-c - 如何设置顶级 NSOutlineView 项目的文本颜色

iphone - SSL 错误、NSURLRequest 和无效证书

ios - 适用于 iOS 的演示叠加层

ios - 我可以找出应用程序图标在主屏幕上的位置吗?

ios - 使用 MPMusicPlayerApplicationController 时如何更新 MPNowPlayingInfoCenter

objective-c - 是否可以制作一个数组的数组

ios - iOS 14 的 RSS 小部件显示为空