SenTestingCase 测试异步block

最近的项目,准备尝试下测试驱动开发。在写异步block的时候纠结了。

SenTesting 在进行测试的时候会发生一个小问题,如果这个testcase 里存在异步测试的话,他肯定是不会等你的。(其实这是废话)

这样导致写在异步block 里面的内容就全都没有执行,那么这个TestCase 就算Accepted了,这是绝对不可以的!

其实我们可以这么做,这里用AFNetworking 举例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
- (void) testGetCardNopasswordDone
{
    ETNetworkAdaptor* adaptor = [ETNetworkAdaptor sharedAdaptor];
    __block BOOL flag = YES;
    [adaptor getCard:kUsedQRCode
            password:nil
             success:^(AFHTTPRequestOperation *operation, id responseObject) {
                 STAssertNotNil(responseObject, @"no response!!!");
                 flag = NO;
             }
             failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                 STFail(@"GetCardFailed, ERROR:%@", error);
             }];
    while (flag) {
        [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode
                                 beforeDate:[NSDate distantFuture]];
    }
}

用了一个很常见的异步处理方法,就是NSRunLoop。

用NSRunLoop来维持这个方法不退出,且不会像while(true)那样忙等待。

具体原理可以参考官方指南 Threading Programming Guide

Comments