【问题标题】:How to test a sendAsynchronousRequest: on XCTest如何测试 sendAsynchronousRequest:在 XCTest 上
【发布时间】:2013-10-08 04:18:52
【问题描述】:

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

-(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: 方法得到一些响应。 提前致谢。

【问题讨论】:

    标签: iphone objective-c sendasynchronousrequest xctest


    【解决方案1】:

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

    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 状态,等待调用将超时并且您的测试将失败(应该如此)。

    【讨论】:

    • 了解 XCAsyncTestCase 自述文件中提到的已知问题之一是“测试在 XCode 构建机器人下运行时挂起”可能很有用。因此,如果您使用构建机器人,您可以查看 iheartradio 的 xctest-additions
    【解决方案2】:

    这是另一个替代方案,基于 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];
    }
    

    【讨论】:

      【解决方案3】:

      这现在包含在 XCode 6 中:

      此处为 Obj-C 示例:

      XCTest and asynchronous testing in Xcode 6

      【讨论】:

        猜你喜欢
        • 2021-03-21
        • 1970-01-01
        • 2016-03-24
        • 2016-06-08
        • 2013-10-23
        • 1970-01-01
        • 1970-01-01
        • 2014-03-07
        相关资源
        最近更新 更多