XCTest 更改队列

Posted

技术标签:

【中文标题】XCTest 更改队列【英文标题】:XCTest change Queue 【发布时间】: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

【问题讨论】:

【参考方案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应该没有问题

以上是关于XCTest 更改队列的主要内容,如果未能解决你的问题,请参考以下文章

根据队列等待时间更改代理颜色

音频队列 |在 audioQueue 运行时更改音频设备

更改 RabbitMQ 队列中的参数

是否可以更改音频队列的播放音高

RabbitMq:更改队列的 x-message-ttl

如何更改默认请求完成队列?