2013-10-11 1 views
1

Я пытаюсь использовать OHHTTPStubs в моем классе XCTest,Не удается получить OHHTTPStubs работать с NSURLSession

Это, как я настроил 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) в своем тесте.

Что может быть здесь? Может быть, ошибка?

ответ

6

@Goles Я знаю, что мы уже обсуждали, что непосредственно на the related issue вы создали на моем 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.2OHHTTPStubs. NSURLSession поддержка действительно была введена в версии 2.4.0 из OHHTTPStubs, но в этой версии были некоторые сбои, которые были исправлены в версии 3.x.

+0

Я забыл об этом вопросе, отметю как принято! ;) – Goles