1

我正在尝试在我的 XCTest 课程中使用 OHHTTPStubs,

这就是我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测试中查询的是正确的 URL(我用 stub 存根的那个)。

这里会发生什么?可能是虫子?

4

1 回答 1

6

@Goles 我知道我们已经在您在我的 GitHub 上创建的相关问题上直接讨论了这一点,但我在这里回答它是为了让其他 SO 读者也可以拥有解决方案。

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

正如 Apple 文档所解释的,NSURLSessionConfiguration一旦它被用于创建NSURLSession. 好吧,你可以,但它不会对已经创建的NSURLSession. 如果您修改一个NSURLSessionConfiguration,您将必须创建一个新NSURLSession的修改后NSURLSessionConfiguration的配置以考虑新的配置。


此外,在 的最新版本中OHHTTPStubs,不再需要显式调用+[setEnabled:forSessionConfiguration:]: 如文档中所述,如果您使用我的库,每个NSURLSessionConfiguration使用创建的defaultSessionConfigurationephemeralSessionConfiguration将自动OHHTTPStubs启用它们。

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


对于那些想要使用OHHTTPStubs的人,NSURLSession我强烈建议使用最新3.0.2版本的OHHTTPStubs. 的版本中NSURLSession确实引入了支持,但是该版本中留下了一些小故障,此后已在版本中修复。2.4.0OHHTTPStubs3.x

于 2013-10-21T16:03:52.423 回答