ios - 阻止回调未从 IOS 中的单元测试程序调用

标签 ios objective-c unit-testing

我有以下设置。我有一个名为“View”的对象,我想在其中对包含两个dispatch_async 调用的方法进行单元测试。

查看.m

typedef void (^onTaskCompletion)();  //defining the block

-(void) viewdidLoad
{

    onTaskCompletion block = ^{
        // callback into the block };

    [self test1:block];

}

-(void) test1:(onTaskCompletion) block
{

    //do something   
    dispatch_async(queue, ^{

    // dispatch async into serial queue & do something

        dispatch_async(dispatch_get_main_queue){

         // calling the block

         block();
        };
    }; 
}

当我运行 IOS APP 时, -(void) viewdidLoad 中的 block 被调用。工作得很好。但我遇到的问题是:

在测试中:XCTestCase (.m fie)

@property (retain) View *view;

-(void) testMyCode
{

 onTaskCompletion block = ^{
        // Never gets called.
   };
   [view test1:block];    
}

当我尝试对该方法 test1() 进行单元测试时,该 block 永远不会被调用。

注意:dispatch_get_main_queue() 内的 test1() 方法中的断点在测试模式下运行时永远不会被击中,但在我刚刚运行应用程序时却会被击中。关于为什么它在应用程序正常运行时有效但在运行单元测试时不起作用有什么想法吗?

最佳答案

您面临的问题是,即使测试尚未完成,测试仍会继续进行。解决方案是停止运行循环,直到异步测试完成。

您可以使用这个极其简单的开源宏 WAIT_WHILE(<expression>, <time_limit>)在这里找到https://github.com/hfossli/AGAsyncTestHelper

- (void)testAsyncBlockCallback
{
    __block BOOL jobDone = NO;

    [Manager doSomeOperationOnDone:^(id data) {
        jobDone = YES; 
    }];

    WAIT_WHILE(!jobDone, 2.0);
}

关于ios - 阻止回调未从 IOS 中的单元测试程序调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20340120/

相关文章:

python - 单元测试中的模拟 Django 命令类变量

javascript - 如何正确清理timbre.js

ios - 将方法分组到 Objective-C 类别中

ios - 如何通过addTarget传递方法参数

ios - 如何在 Windows 8 上安装 Xcode?

ios - 使用自动布局视觉格式语言是否可以将 View 的宽度设置为等于同一 View 的高度?

objective-c - 是什么让符号变得懒惰或非懒惰?

java - 在单元测试中使用 SpringRunner 可以吗?

objective-c - 在 UIViewController 中模拟 UIView

java - 如何在android sdk上使用PowerMock