iOS 8中如何测试HTTP请求?

3
在Ruby中,我曾经使用vcr gem来测试http请求,该gem记录了请求,因此测试不会向真实主机发送请求。在iOS8世界中是否有类似的东西呢? 我想要测试的请求确实需要被记录,因为这些请求可能在某个时间过期,并返回其他响应。
附言:如果有类似于XCTest的默认苹果/iOS方法/库进行测试将是很好的。

尝试使用“NSURLProtocol”,https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Classes/NSURLProtocol_Class/index.html。使用NSURLProtocol,您可以拦截HTTP请求,匹配并提供缓存响应。 - gagarwal
好的,在这种情况下,我需要实现整个框架来记录响应,而我宁愿使用一些已经编写好的库。 - hasrthur
1
https://github.com/luisobo/Nocilla - vikingosegundo
这个程序桩了响应,但问题是我必须手动操作,而我希望库能够记录请求本身。当下一次进行请求时,它应该使用记录的数据而不是真正连接到服务器,并且我应该能够在没有互联网的情况下运行它。 - hasrthur
1
如果您仔细阅读,就会发现这在自述文件中已经有了答案。 - vikingosegundo
但是,我仍然需要使用 curl -is 记录每个请求,然后才能在测试中使用它,这并不是很方便。此外,如果有一天我想要更新我的记录请求,那么将会非常麻烦,因为我需要手动重新记录每个请求。 - hasrthur
2个回答

1

我不确定我是否正确理解了你的意思。但如果我理解正确,你应该能够使用XCTest来测试你的请求和响应。

class Tests:XCTestCase{

    func testing(){
        var expectation = self.expectationWithDescription("Your request")

        var url = NSURL(string: "http://yourUrl.com")

        let task = NSURLSession.sharedSession().dataTaskWithURL(url!) {(data, response, error) in
            if let httpRes = response as? NSHTTPURLResponse {
                println("status code=",httpRes.statusCode)
                //200 means OK
                if httpRes.statusCode == 200 {
                    println(NSString(data: data, encoding: NSUTF8StringEncoding))
                }
            }else{
                println("error \(error)")
            }
        }

    }

}

谢谢您的回答,但那不是我要找的。请参阅此评论:https://dev59.com/XIfca4cB1Zd3GeqPpexS#v1sRoYgBc1ULPQZFC4P4 - hasrthur

1
你需要的是类似于OHHTTPStubs、Nocilla或AMY server的东西。它们都基本上使用NSURLProtocol来拦截你的请求,并允许你指定一个响应。我们使用了OHHTTPStubs,但选择最接近你使用情况的功能集的那个。
这里有一个OHHTTPStubs实现的例子,用于单个REST端点的服务单元测试:
NSString *loadRoomJSON = @{ @"key" : @"value" }; /* some JSON */
NSNumber identifier = @1;
[OHHTTPStubs stubRequestsPassingTest:^BOOL(NSURLRequest *request) {
    NSString *url = [NSString stringWithFormat:@"v1/user/%@/room", identifier];
    XCTAssert([request.URL.relativePath containsString:url], @"Expected certain URL");
    return YES;
} andRespond:^OHHTTPStubsResponse *(NSURLRequest *request) {
    return [OHHTTPStubsResponse responseWithJSONObject:loadRoomJSON statusCode:200 headers:nil];
}];

XCTestExpectation *loadPromise = [self expectation:@"Room loaded"];
[service loadRoomOnSucceed:^(Room *room) {
    // Do your asserts here.  For us, the JSON is mapped to an object
    // so for example you could assert that the object is mapped correctly
    [loadPromise fulfill];
} onFail:^(NSError *error) {
    expect(error).to.beNil();
}];

[self waitForExpectationsWithTimeout:1.0 handler:^(NSError *error) {
    expect(error).to.beNil();
}];

实际上,我们的测试比较简短,因为我们编写了包装器/助手使其更易于阅读,所以这是一个展开版本。应该能给你一个大致的想法。OHHTTPStubs(如果您使用它)也有助手函数可以直接从文件中加载响应。

你是如何使用那个库的?你手动发送请求,保存响应并在测试中使用已保存的文件吗? - hasrthur
@arthur.borisow 这个库只是提供了模拟行为。生成模拟响应的工作是开发人员的职责。你可以根据文档制作它,复制一个实际响应并进行修改,或者其他方式。我编辑了答案,包括使用OHHTTPStubs测试JSON端点的示例。对于其他框架,同样适用一般模式。 - plluke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接