【问题标题】:How one tests http requests in iOS 8?如何在 iOS 8 中测试 http 请求?
【发布时间】:2015-02-16 21:59:28
【问题描述】:

在 ruby​​ 中,我曾经使用记录请求的 vcr gem 测试 http 请求,因此测试不会将请求发送到真实主机。 iOS8世界里有这样的东西吗? 我要测试的请求确实需要记录,因为这些请求可能会在一段时间后过时并且会返回一些其他响应

附:如果它是一些默认的 Apple/iOS 方法/库(如 XCTest)用于一般测试,那就太好了

【问题讨论】:

  • 尝试使用“NSURLProtocol”,developer.apple.com/library/mac/documentation/Cocoa/Reference/…。使用 NSURLProtocol 你可以拦截 HTTP 请求,匹配并返回缓存的响应。
  • 好吧,在这种情况下,我需要实现整个框架来记录响应,而我宁愿使用一些已经编写好的库
  • 这个存根响应,但问题是我必须手动完成,我希望库自己记录该请求。当我下次发出请求时,它应该使用记录的数据而不是真正连接到服务器,即使没有互联网我也应该能够运行它
  • 如果你仔细阅读,你会发现自述文件中已经回答了这个问题

标签: ios unit-testing swift ios8 xctest


【解决方案1】:

您想要的是 OHHTTPStubs 或 Nocilla 或 AMY 服务器。它们基本上都使用 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(如果你使用它的话)也有帮助函数直接从文件加载响应。

【讨论】:

  • 你是如何使用那个库的?您是否手动执行请求,将响应存储在那里,然后在测试中使用保存的文件?
  • @arthur.borisow 该库只是为您提供模拟行为。如何生成模拟响应是开发人员的工作。您可以根据文档制作它,复制实时响应并对其进行修改,无论如何。我编辑了答案以包含一个带有 OHHTTPStubs 的 JSON 端点测试示例。相同的通用模式也适用于其他框架。
【解决方案2】:

我不确定我的理解是否正确。但如果我理解正确,您应该可以使用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)")
            }
        }

    }

}

【讨论】:

猜你喜欢
  • 2021-01-25
  • 2015-11-04
  • 2018-05-22
  • 2020-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-07
相关资源
最近更新 更多