很抱歉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:方法的响应。 提前谢谢。
答案 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)