12

抱歉这个菜鸟问题,但我正在尝试测试连接,但我无法验证请求的返回,因为测试在完成处理程序有机会执行之前结束。说明:

-(void)testConnection
{

    [[Conector sharedInstance] performAsynchronousRequestWithServerRequest:_srvRequest completionHandler:^(RequestAsynchronousStatus finishStatus, NSData *data) {
        if (finishStatus == RequestAsynchronousOK){
            _data = data;
            NSLog(@"Data OK");
        }
    }];

    XCTAssertNotNil(_data, @"Data was nil");

}

当我尝试断言时,_data 将始终为零,因为尚未执行完成处理程序。有一种机制可以强制测试等到我从 sendAsynchronousRequest: 方法得到一些响应。提前致谢。

4

3 回答 3

22

这看起来正是您所需要的:

XCAsyncTestCase:支持异步的 SenTestCase 子类。

基本上,您应该这样编写测试:

- (void)testConnection
{
    [[Conector sharedInstance] performAsynchronousRequestWithServerRequest:_srvRequest completionHandler:^(RequestAsynchronousStatus finishStatus, NSData *data) {
        if (finishStatus == RequestAsynchronousOK)
        {
            _data = data;
            [self notify:XCTAsyncTestCaseStatusSucceeded];
            NSLog(@"Data OK");
        }
    }];

    [self waitForTimeout:10];

    XCTAssertNotNil(_data, @"Data was nil");
}

注意waitForTimeout:电话和notify:电话。10 秒应该足够测试了,尽管这取决于请求本身。

您甚至可以更具体地等待某个状态,如下所示:

[self waitForStatus: XCTAsyncTestCaseStatusSucceeded timeout:10];

这样,如果连接无法通知XCTAsyncTestCaseStatusSucceeded状态,等待调用将超时并且您的测试将失败(应该如此)。

于 2013-10-01T23:13:46.393 回答
5

这是另一种选择,基于 GHUnit 版本的 XCAsyncTestCase:

https://github.com/iheartradio/xctest-additions

用法是一样的,只是导入并继承 XCAsyncTestCase。

@implementation TestAsync
- (void)testBlockSample
{
    [self prepare];
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(){
        sleep(1.0);
        [self notify:kXCTUnitWaitStatusSuccess];
    });
    // Will wait for 2 seconds before expecting the test to have status success
    // Potential statuses are:
    //    kXCTUnitWaitStatusUnknown,    initial status
    //    kXCTUnitWaitStatusSuccess,    indicates a successful callback
    //    kXCTUnitWaitStatusFailure,    indicates a failed callback, e.g login operation failed
    //    kXCTUnitWaitStatusCancelled,  indicates the operation was cancelled
    [self waitForStatus:kXCTUnitWaitStatusSuccess timeout:2.0];
}
于 2013-10-23T14:07:44.230 回答
4

这现在包含在 XCode 6 中:

此处的 Obj-C 示例:

Xcode 6 中的 XCTest 和异步测试

于 2014-12-29T21:10:49.337 回答