Я хотел бы знать, как "unit test" HTTP-запросы и ответы, используя NSURLSession. Прямо сейчас мой код блока завершения не вызывается при запуске как unit test. Однако, когда тот же код выполняется из AppDelegate
(didFinishWithLaunchingOptions), вызывается код внутри блока завершения. Как было предложено в этой статье, NSURLSessionDataTask dataTaskWithURL обработчик завершения, который не получает вызов, необходимо использовать семафоры и/или dispatch_group ", чтобы убедиться, что основной поток заблокирован до тех пор, пока сеть запрос заканчивается."
Мой почтовый HTTP-код выглядит следующим образом.
@interface LoginPost : NSObject
- (void) post;
@end
@implementation LoginPost
- (void) post
{
NSURLSessionConfiguration* conf = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession* session = [NSURLSession sessionWithConfiguration:conf delegate:nil delegateQueue:[NSOperationQueue mainQueue]];
NSURL* url = [NSURL URLWithString:@"http://www.example.com/login"];
NSString* params = @"[email protected]&password=test";
NSMutableRequest* request = [NSMutableURLRequest requestWithURL:url];
[request setHTTPMethod:@"POST"];
[request setHTTPBody:[params dataUsingEncoding:NSUTF8StringEncoding]];
NSURLSessionDataTask* task = [session dataTaskWithRequest:request completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
NSLog(@"Response:%@ %@\n", response, error); //code here never gets called in unit tests, break point here never is triggered as well
//response is actually deserialized to custom object, code omitted
}];
[task resume];
}
@end
Метод, который проверяет это, выглядит следующим образом.
- (void) testPost
{
LoginPost* loginPost = [LoginPost alloc];
[loginPost post];
//XCTest continues by operating assertions on deserialized HTTP response
//code omitted
}
В моем AppDelegate
код блока завершения работает, и он выглядит следующим образом.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//generated code
LoginPost* loginPost = [LoginPost alloc];
[loginPost post];
}
Любые указатели на то, как получить блок завершения, выполняемый при работе внутри unit test? Я новичок в iOS, поэтому ясный пример действительно поможет.
- Примечание. Я понимаю, что я прошу, также не может быть "единичным" тестированием в строгом смысле в том смысле, что я полагаюсь на HTTP-сервер в качестве части моего теста (это значит, что я прошу больше походить на интеграцию тестирование).
- Примечание. Я понимаю, что есть еще один поток Unit тесты с NSURLSession об модульном тестировании с помощью NSURLSession, но я не хочу издеваться над ответами.