Не удается заставить 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 поскольку.

Другие вопросы по тегам