Не удается заставить OHHTTPStubs работать с NSURLSession
Я пытаюсь использовать OHHTTPStubs в моем классе XCTest,
Вот как я настроил OHTTPStubs
в моем тестовом файле.
//
// Tests Configuration
//
- (void)setUp
{
[super setUp];
_bundle = [NSBundle bundleForClass:[self class]];
[self configureHTTPStubs];
[self installHTTPStubs];
}
- (void)configureHTTPStubs
{
[OHHTTPStubs onStubActivation:^(NSURLRequest *request, id<OHHTTPStubsDescriptor> stub) {
NSLog(@"[OHHTTPStubs] Request to %@ has been stubbed with %@", request.URL, stub.name);
}];
}
- (void)installHTTPStubs
{
HIAPIRequests *requester = [[HIAPIOperator sharedOperator] requester];
[OHHTTPStubs setEnabled:YES forSessionConfiguration:requester.session.configuration];
[OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) {
return [request.URL.path isEqualToString:@"/image_upload"];
} withStubResponse:^OHHTTPStubsResponse *(NSURLRequest *request) {
return [[OHHTTPStubsResponse responseWithFileAtPath:OHPathForFileInBundle(@"image_upload_ws_response.json", nil)
statusCode:201
headers:@{@"Content-Type":@"text/json"}] responseTime:OHHTTPStubsDownloadSpeed3G];
}].name = @"Image Upload OK";
}
//
// In my Requester class this is how I setup the NSURLSession configuration
//
- (void)configureURLSession
{
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
_session = [NSURLSession sessionWithConfiguration:config];
}
И вот как я выполняю запрос
- (void)uploadImage:(UIImage *)image
completionBlock:(operationCompletionBlock)completionBlock
progressBlock:(operationProgressBlock)progressBlock
{
NSData *imageData = UIImageJPEGRepresentation(image, 0.80);
NSURLRequest *request = [NSURLRequest requestWithURLString:@"/image_upload"];
NSURLSessionUploadTask *uploadTask = [_session uploadTaskWithRequest:request
fromData:imageData
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) {
completionBlock(data, error);
}];
[_progressTable setObject:progressBlock forKey:uploadTask];
[uploadTask resume];
}
в completionHandler
обратный вызов Я в основном получаю ошибку "не найден домен" (error NSURLError * domain: @"NSURLErrorDomain" - code: -1003 0x08a70740
), @"A server with the specified hostname could not be found."
Я полностью уверен, что запрашиваю правильный URL-адрес (тот, который я заглушил OHHTTPStubs
) в моем тесте.
Что здесь может происходить? Ошибка может быть?
1 ответ
@Goles Я знаю, что мы уже обсуждали это непосредственно по связанной проблеме, которую вы создали на моем GitHub, но я отвечаю на нее здесь, чтобы другие читатели SO тоже могли найти решение.
Проблема в коде @Goles заключается в том, что он использует [OHHTTPStubs setEnabled:YES forSessionConfiguration:requester.session.configuration];
на NSURLSessionConfiguration
который уже использовался для создания его NSURLSession
,
Как объясняется в документации Apple, вы не можете изменить NSURLSessionConfiguration
когда он был использован для создания NSURLSession
, Ну, вы можете, но это не повлияет на уже созданный NSURLSession
, Если вы измените NSURLSessionConfiguration
, вам придется создать новый NSURLSession
с этим измененным NSURLSessionConfiguration
принять новую конфигурацию во внимание.
Более того, в последних версиях OHHTTPStubs
, больше не нужно явно вызывать +[setEnabled:forSessionConfiguration:]
: как объяснено в документации, каждый NSURLSessionConfiguration
создан с defaultSessionConfiguration
или же ephemeralSessionConfiguration
будет автоматически иметь OHHTTPStubs
включен на них, если вы используете мою библиотеку.
Это означает, что вам не нужно ничего менять в рабочем коде, чтобы заглушки подключались к вашим сеансам и сетевым запросам (даже если вы создаете NSURLSessionConfiguration
а также NSURLSession
где-то глубоко спрятано в коде вашего приложения).
Для тех из вас, кто хочет использовать OHHTTPStubs
с NSURLSession
Я настоятельно рекомендую использовать последние 3.0.2
версия OHHTTPStubs
, NSURLSession
поддержка действительно была введена в версии 2.4.0
из OHHTTPStubs
, но в этой версии остались некоторые глюки, которые были исправлены в версии 3.x
поскольку.