【问题标题】:XCTest change QueueXCTest 更改队列
【发布时间】:2014-11-12 12:42:44
【问题描述】:

是否可以将 XCTest 中使用的队列从 com.apple.main 队列更改为不同的队列?我在测试一个应用程序时遇到了麻烦,该应用程序也分派到这个队列,因此没有进入一个 dispatch_async 块。这种现象显然与被测试者阻塞的已用队列有关。有没有办法改变 XCTest 测试器中的“dispatch_get_current_queue”输出?

语言:目标 C
XCode:6.0.1
XCTest:在 iPad 上与 Hostapplication 进行集成测试
目标操作系统:iOS 7.1 和 8

【问题讨论】:

    标签: ios objective-c xcode grand-central-dispatch xctest


    【解决方案1】:

    这是我运行异步单元测试的方式

    在单元测试之上添加这个宏。

    // Macro - Set the flag for block completion
    #define StartBlock() __block BOOL waitingForBlock = YES
    
    // Macro - Set the flag to stop the loop
    #define EndBlock() waitingForBlock = NO
    
    // Macro - Wait and loop until flag is set
    #define WaitUntilBlockCompletes() WaitWhile(waitingForBlock)
    
    // Macro - Wait for condition to be NO/false in blocks and asynchronous calls
    // Each test should have its own instance of a BOOL condition because of non-thread safe operations
    #define WaitWhile(condition) \
    do { \
    while(condition) { \
    [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:0.1]]; \
    } \
    } while(0)
    

    所以测试可以这样写

    - (void)testContentNode
    {
        StartBlock();
        [AFContentNode loadContentWithUUID:@"d6d87899-94d4-4540-aeab-e88647e4ad61"
                                completion:^(AFMagnoliaNode *node, NSError *error)
         {
             XCTAssert(!error, @"Error raised: %@", error);
             XCTAssert(node, @"Node has not been fetched");
             EndBlock();
         }];
        WaitUntilBlockCompletes();
    }
    

    【讨论】:

    • 这在使用 testhost 进行测试(集成测试)时是否有效?还是你用模拟器?
    • 我用的是模拟器,但是testhost应该没有问题
    猜你喜欢
    • 1970-01-01
    • 2021-10-02
    • 2023-04-10
    • 2021-06-06
    • 1970-01-01
    • 2018-04-30
    • 1970-01-01
    • 2017-03-01
    • 1970-01-01
    相关资源
    最近更新 更多