无法使OHHTTPStub与NSURLSession一起使用

时间:2013-10-11 00:11:06

标签: iphone ios ios7 ohhttpstubs

我试图在我的XCTest类中使用OHHTTPStub,

这是我在测试文件中配置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."

我完全确定我在测试中查询了正确的网址(我用OHHTTPStubs创建的网址)。

这可能会发生什么?可能有错误吗?

1 个答案:

答案 0 :(得分:6)

  

@Goles我知道我们已经在你在我的GitHub上创建的the related issue上直接讨论了这个问题,但是我在这里回答它,以便其他SO读者也可以得到解决方案。

@Goles代码中的问题是他在已用于创建[OHHTTPStubs setEnabled:YES forSessionConfiguration:requester.session.configuration];的{​​{1}}上使用NSURLSessionConfiguration

正如Apple文档所述,用NSURLSession 创建NSURLSessionConfiguration 后,您无法修改NSURLSession。嗯,你可以,但它不会对已经创建的NSURLSession产生任何影响。如果您修改NSURLSessionConfiguration,则必须使用修改后的NSURLSession创建新的NSURLSessionConfiguration,以便将新配置考虑在内。


此外,OHHTTPStubs的最新版本中的,不再需要明确调用+[setEnabled:forSessionConfiguration:] :如文档中所述,每创建NSURLSessionConfiguration defaultSessionConfiguration如果您使用我的资源库,ephemeralSessionConfigurationOHHTTPStubs会自动启用NSURLSessionConfiguration

这意味着您无需更改工作代码中的任何内容,即可将存根挂钩到您的会话和网络请求中(即使您创建了NSURLSessionOHHTTPStubs深处隐藏的地方你的应用代码)。


对于那些希望NSURLSession3.0.2一起使用的人,我强烈建议您使用最新OHHTTPStubs版本的NSURLSession2.4.0的版本OHHTTPStubs确实引入了3.x支持,但该版本中还有一些问题已经在版本{{1}}中修复了。