如何使用OCMock将函数块存根以返回递增值?

时间:2016-10-17 19:23:16

标签: objective-c cocoa-touch ocmock

OCMock的文档非常清晰。我有特定的类级函数存根。这是一个请求,看起来像这样:

OCMStub([self.mockApiManager 
    requestToURL:[OCMArg any] 
    method:[OCMArg any] 
    keypath:[OCMArg any] 
    parameters:[OCMArg any] 
    objectClass:[OCMArg any] 
    shouldRetry:NO 
    retryBlock:nil 
    withCompletionBlock:([OCMArg invokeBlockWithArgs:@(1), @[@(apiRequestCount)], requestOperation, [[NSError alloc] init], @(0), nil])])._andDo(^(NSInvocation *invocation) {

        apiRequestCount++;
});

我感兴趣的部分是[OCMArg invokeBlockWithArgs:@(1), @[@(apiRequestCount)], requestOperation, [[NSError alloc] init], @(0), nil]。特别是我传入apiRequestCount的地方。

apiRequestCount是我的测试类上的静态int。我希望每次调用-requestToURL:metho...函数/存根时都传回一个递增的值。所以调用一次,然后返回0.再次调用它,返回1.等等。

然而,尽管这个函数获得了3次存根,但我获得了invokeBlockWithArgs的0。谁能想到解决这个问题的方法呢?

1 个答案:

答案 0 :(得分:1)

在创建存根并在invokeBlockWithArgs上调用OCMArg方法时,将获取所有参数(包括apiRequestCount)并将其保存在幕后的对象中。对apiRequestCount的进一步更新不会更新该内部状态,因此使用与最初提供的值相同的方式调用该块。

尽管如此,invokeBlock方法只是为了方便。在您的情况下,您可以传递[OCMArg any]作为block参数以确保存根匹配。然后,在传递给andDo的块中,您可以从NSInvocation中提取完成处理程序块,并使用正确的值调用它。