我试图在我的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
创建的网址)。
这可能会发生什么?可能有错误吗?
答案 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
如果您使用我的资源库,ephemeralSessionConfiguration
或OHHTTPStubs
会自动启用NSURLSessionConfiguration
。
这意味着您无需更改工作代码中的任何内容,即可将存根挂钩到您的会话和网络请求中(即使您创建了NSURLSession
和OHHTTPStubs
深处隐藏的地方你的应用代码)。
对于那些希望NSURLSession
与3.0.2
一起使用的人,我强烈建议您使用最新OHHTTPStubs
版本的NSURLSession
。 2.4.0
的版本OHHTTPStubs
确实引入了3.x
支持,但该版本中还有一些问题已经在版本{{1}}中修复了。