OCMock:OCMPartialMock对象调用实际方法而不是存根

时间:2016-05-26 11:48:46

标签: objective-c unit-testing tdd ocmock

我在一个类中有两个方法,其中一个方法只使用特定参数调用另一个方法。方法如下:

-(void)loadAllFollowersForUser:(NSUInteger)userID withResponseHandler:(_Nullable CompletionHandler)handler {
[self loadFollowersForUser:userID
                fromOffSet:0
                   toLimit:100000
       withResponseHandler:handler];
}

-(void)loadFollowersForUser:(NSUInteger)userID fromOffSet:(NSInteger)offset toLimit:(NSInteger)limit withResponseHandler:(_Nullable CompletionHandler)handler {
    NSLog(@"Actual loadFollowersForUser method got called!");
}

我正在试用TDD并且一直在使用OCMock。我有以下测试,只是测试loadAllFollowers在内部调用另一个方法

- (void)testLoadAllFollowersCallsLoadFollowers {
    id partialMockSUT = OCMPartialMock(self.sut);

    OCMExpect([partialMockSUT loadFollowersForUser:[OCMArg any]
                                         fromOffSet:[OCMArg any]
                                            toLimit:[OCMArg any]
                                withResponseHandler:[OCMArg any]]);

    [partialMockSUT loadAllFollowersForUser:123
                           withResponseHandler:^(BOOL success, id response, NSError *error) {

                           }];

    OCMVerifyAll(partialMockParser);

}

我正在使用部分模拟因为我只想存根loadFollowersForUser方法并调用loadAllFollowers方法的实际实现。这几乎完全是这样,但我的测试总是无法满足期望,我在控制台中看到了NSLog。

我尝试过的事情:

  1. 我尝试添加其他临时方法来验证parital mocks的行为,并且它们的表现完全符合预期
  2. This问题表明我想要做的事情应该是非常可能的
  3. 在OCMExpect内联OCMock文档之后,我尝试为该方法添加OCMStub。见this page
  4. 上的10.2

    我不确定是否传入块的问题或者方法返回类型是否为空而且我没有期望的操作。

1 个答案:

答案 0 :(得分:3)

根据the OCMock docs[OCMArg any]占位符仅传递“对象,指针和选择器”

这里的问题可能是该方法存在标量参数,因此期望失败。文档建议通过调用ignoringNonObjectArgs来存储方法来处理标量参数的变通方法。这可能看起来像:

OCMExpect([[partialMockSUT ignoringNonObjectArgs]
                       loadFollowersForUser:[OCMArg any]
                                 fromOffSet:0  // or any value
                                    toLimit:0  // or any value
                        withResponseHandler:[OCMArg any]]);

不是100%肯定,因为我自己没有尝试过。