2013-10-11 76 views
1

我想在我的XCTest类使用OHHTTPStubs工作,无法获得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标出的那个URL)。

这里可能会发生什么?错误可能?

回答

6

@Goles我知道我们已经讨论了直接the related issue你对我的GitHub上创建的,但我在这里回答它,以便其他以便读者能有解决方案了。

在@Goles“代码的问题是,他上NSURLSessionConfiguration使用[OHHTTPStubs setEnabled:YES forSessionConfiguration:requester.session.configuration];一个已经用于创建它的NSURLSession

随着苹果文档解释了,一旦它已被用于创建一个NSURLSession你不能修改NSURLSessionConfiguration。那么,你可以,但它不会对已经创建的NSURLSession有任何影响。如果修改NSURLSessionConfiguration,则必须创建一个新的NSURLSession,修改NSURLSessionConfiguration以考虑新配置。


此外,OHHTTPStubs的最新版本,它不再需要显式调用+[setEnabled:forSessionConfiguration:]:如文档中解释的,defaultSessionConfigurationephemeralSessionConfiguration创建的每个NSURLSessionConfiguration会自动将它们启用OHHTTPStubs,如果你使用我的图书馆。

这意味着您不需要更改工作代码中的任何内容,以便将存根挂接到会话和网络请求中(即使您在应用程序代码中隐藏深处创建NSURLSessionConfigurationNSURLSession)。


对于那些你们谁想要使用OHHTTPStubsNSURLSession我强烈建议使用最新版本的3.0.2OHHTTPStubsNSURLSession确实在版本2.4.0OHHTTPStubs中引入了支持,但该版本中仍存在一些故障,因此版本3.x已得到修复。

+0

我忘了这个问题,将标记为已接受! ;) – Goles