如何在XCTest上测试sendAsynchronousRequest :.

And*_*que 12 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");

}
Run Code Online (Sandbox Code Playgroud)

当我尝试断言时,_data将始终为nil,因为还没有执行完成处理程序.有一种机制可以强制测试等待,直到我收到sendAsynchronousRequest:方法的响应.提前致谢.

Ian*_*Ian 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");
}
Run Code Online (Sandbox Code Playgroud)

注意waitForTimeout:通话和notify:通话.10秒应该足以进行测试,但这取决于请求本身.

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

[self waitForStatus: XCTAsyncTestCaseStatusSucceeded timeout:10];
Run Code Online (Sandbox Code Playgroud)

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

  • 知道XCAsyncTestCase自述文件中提到的一个已知问题是"在XCode构建机器人下运行时测试挂起"可能会有用.因此,如果你正在使用构建机器人,你可能会看看iheartradio的`xctest-additions`. (2认同)

Sve*_*ken 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];
}
Run Code Online (Sandbox Code Playgroud)