如何在XCTest上测试sendAsynchronousRequest :.

时间:2013-10-01 20:57:38

标签: iphone objective-c sendasynchronousrequest xctest

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

-(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将始终为nil,因为还没有执行完成处理程序。有一种机制可以强制测试等待,直到我收到sendAsynchronousRequest:方法的响应。 提前谢谢。

3 个答案:

答案 0 :(得分: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状态,则等待调用将超时,您的测试将失败(应该如此)。

答案 1 :(得分: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];
}

答案 2 :(得分:4)

现在包含在XCode 6中:

这里的Obj-C示例:

XCTest and asynchronous testing in Xcode 6