使用 OCMock 模拟块期望

Posted

技术标签:

【中文标题】使用 OCMock 模拟块期望【英文标题】:Use OCMock to mock a block expectation 【发布时间】:2012-10-11 11:08:35 【问题描述】:

我是 OCMock 的新手,我打算模拟一个请求调用。需要模拟的 API 按如下定义执行。

   [ProductRequest requestProductUpdateUrl: @"testUrl" withParameters:params   error:^(NSString *updateUrl, NSError *error)
        if (!error && [updateUrl length] !=0 ) 
           NSLog(@"Success");
         else 
             NSLog(@"Error");
        
   ];

知道如何使用 OCMock 模拟方法 requestProductUpdateUrl 吗?

【问题讨论】:

看起来requestProductUpdateUrl 是一个类方法。那是对的吗?你不能用 OCMock 模拟类方法。 @Christopher 是的,这是一个类方法,但我也可以将其修改为不是类方法。谢谢你指出。如果是这样,我的代码将被修改 self.productService = [OCMockObject mockForClass:[ProductService class]]; [self.productService requestProductUpdateUrl: @"testUrl" withParameters:params error:^(NSString *updateUrl, NSError *error) if (!error && [updateUrl length] !=0 ) NSLog(@"Success"); else NSLog(@"错误"); ]; 好的,那么你想测试什么?您是否只想验证它是否已被调用,是否已使用某个块调用,等等? 我想为方法提供一个模拟存根 【参考方案1】:

这个功能还没有实现,虽然我认为他们正在努力。我也必须这样做:

semaphore = dispatch_semaphore_create(0);
[myObject myFunctionWithCallback:^(BOOL success)
     if(success)
        dispatch_semaphore_signal(semaphore);
     else
        STFail(@"Call failed"); dispatch_semaphore_signal(semaphore);

];
[self waitForSemaphore];

使用等待功能是这样的:

- (void)waitForSemaphore;

float step_duration = .1;
float wait_steps = 2 / step_duration;
while (dispatch_semaphore_wait(semaphore, dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC / 10)) && wait_steps > 0)
    CFRunLoopRunInMode(kCFRunLoopDefaultMode,step_duration, YES);
    wait_steps--;


if (wait_steps <= 0) 
    STFail(@"Timeout!");

【讨论】:

以上是关于使用 OCMock 模拟块期望的主要内容,如果未能解决你的问题,请参考以下文章

使用 OCMock 发生意外崩溃,在 NSString 上模拟“mutableCopy”

OCMock:模拟协议未正确停止

OCMock 部分模拟给出了意外的调用

在 NSMutableAttributedString 上模拟“initWithAttributedString”的 OCMock 失败

OCMock - 试图模拟 NSEntityDescription

如何使用 ocmock 验证部分模拟是不是具有使用 args 调用的基本方法?