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状态,则等待调用将超时,您的测试将失败(应该如此).
这是另一个替代方案,基于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)