objective-c - OCMock:OCMPartialMock 对象调用实际方法而不是 stub

标签 objective-c unit-testing tdd ocmock

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

-(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);

}

我使用部分模拟,因为我只想 stub loadFollowersForUser 方法并调用 loadAllFollowers 方法的实际实现。这几乎完全做到了这一点,但我的测试总是无法达到预期,并且我在控制台中看到 NSLog。

我尝试过的事情:

  1. 我尝试添加其他临时方法来验证部分模拟的行为,它们的执行完全符合预期
  2. This问题表明我想做的事情应该是很有可能的
  3. 我尝试在 OCMExpect 内联 OCMock 文档之后添加 OCMStub 方法。请参阅 this page 上的 10.2

我不确定是否是传入的 block 有问题,或者方法返回类型为空,并且我没有针对期望采取任何操作。

最佳答案

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

这里的问题可能是该方法有标量参数,因此期望失败。文档建议了一种解决方法,通过调用 ignoringNonObjectArgs 来 stub 该方法来处理标量参数。所以这可能看起来像:

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

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

关于objective-c - OCMock:OCMPartialMock 对象调用实际方法而不是 stub ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37460050/

相关文章:

javascript - 谷歌日历 sinon stub 似乎不起作用

visual-studio-2010 - 2010 年单元测试自定义代码分析规则 - 任何希望

silverlight - 具有 RIA 服务的 Entity Framework ,Silverlight - 解耦与快速开发的权衡

java - 如何在单元测试(junit)中管理巨大的类和重构

iphone - 以最快的方式获取 facebook 好友头像 - iOS

ios - 如何更改动画 UIImage 的持续时间?

ios - prepareForSegue :sender: gets wrong sender

objective-c - KVO 和更改 UI 值更改

Android:测试运行失败:由于 'java.lang.IncompatibleClassChangeError',仪器运行失败

java - 如何使这个 SwingWorker 代码可测试