2013-10-11 2 views
4

Я пишу тест, блок с AFNetworking 2,0 и OHHTTPStubs и испытания всегда не удалось с этими ошибками: ошибкакакао Ошибка 3840 на AFNetworking

Response: Операция не может быть завершена. (Ошибка какао 3840.).

Большое спасибо!

Ниже простой тест Json (User.json): { "идентификатор пользователя": "абв", "электронная почта": "[email protected]", "имя пользователя": "UserA" }

и тестовых примеров кодов:

- (void)testGet 
{ 
    [OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) { 
     return YES; // Stub ALL requests without any condition 
    } withStubResponse:^OHHTTPStubsResponse*(NSURLRequest *request) { 
     return [OHHTTPStubsResponse responseWithFileAtPath:OHPathForFileInBundle(@"User.json",nil) 
      statusCode:200 headers:@{@"Content-Type":@"application/json"}]; 
    }]; 

    dispatch_semaphore_t semaphore = dispatch_semaphore_create(0); 

    AFHTTPSessionManager* requestManager = [[AFHTTPSessionManager alloc]initWithBaseURL:[NSURL URLWithString:@"http://test.com"]]; 
    AFJSONResponseSerializer* responseSerializer = [[[AFJSONResponseSerializer alloc]init] autorelease]; 
    responseSerializer.readingOptions = NSJSONReadingAllowFragments; 
    responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"]; 
    responseSerializer.acceptableStatusCodes = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 2)]; 
    requestManager.responseSerializer = responseSerializer; 

    AFJSONRequestSerializer* requestSerializer = [[AFJSONRequestSerializer alloc] init]; 
    requestSerializer.writingOptions = NSJSONWritingPrettyPrinted; 
    [requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 

    requestManager.requestSerializer = requestSerializer; 

    _done = NO; 
    [requestManager GET:@"stream" parameters:nil success:^(NSURLSessionDataTask * task, id JSON) 
    { 
     NSLog(@"Response data:%@", JSON); 
     XCTAssert(JSON != nil, @"null response"); 
     dispatch_semaphore_signal(semaphore); 

    } failure:^(NSURLSessionDataTask *__unused task, NSError *error) { 
     NSLog(@"Response error:%@", [error localizedDescription]); 
     XCTFail(@"fail to get response"); 
     dispatch_semaphore_signal(semaphore); 
    }]; 

    while (dispatch_semaphore_wait(semaphore, DISPATCH_TIME_NOW)) 
    { 
     [[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode 
           beforeDate:[NSDate dateWithTimeIntervalSinceNow:10]]; 
    } 
} 
+0

JSON, приведенный выше, действителен JSON, но Cocoa error 3840 означает, что вход JSON недействителен. Либо структура в 'User.json' недопустима, либо ваша кодировка файлов не поддерживается спецификацией JSON. –

+1

Если вы зарегистрируете полный NSError вместо локализованного описания, вы обнаружите, что он указывает смещение в поток JSON, где произошла ошибка, часто из-за символов, отличных от UTF-8. – SteveCaine

ответ

0

Попробуйте использовать вместо AFHTTPResponseSerializer. Таким образом, в основном, замените этот код:

AFJSONResponseSerializer* responseSerializer = [[[AFJSONResponseSerializer alloc]init] autorelease]; 
    responseSerializer.readingOptions = NSJSONReadingAllowFragments; 
    responseSerializer.acceptableContentTypes = [NSSet setWithObject:@"text/html"]; 
    responseSerializer.acceptableStatusCodes = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(200, 2)]; 
    requestManager.responseSerializer = responseSerializer; 

к этому:

requestManager.responseSerializer = [AFHTTPResponseSerializer serializer]; 

Поскольку вы используете acceptableContentType из @ «текст/html», я предполагаю, что вы не нуждаетесь в JSON сериализатор на ответ. Так что это должно быть хорошо для вашего дела.

Смежные вопросы