测试CLGeocoder geocodeAddressString方法的地标总是为零

时间:2016-08-12 05:39:24

标签: ios swift unit-testing clgeocoder

代码来自书本,它在第一个XCTFail()中总是失败,我在设备和模拟器上都尝试过,它应该是网络问题,查看错误,它显示{{ 1}}

Optional(Error Domain=kCLErrorDomain Code=2 "(null)")

1 个答案:

答案 0 :(得分:3)

你说它不应该是网络错误,但这恰恰是代码为2的CLErrorDomain错误(CLError.Network)。你可以出于各种原因得到它。例如,当我尝试监视与Charles的通信时,我得到了它,但还没有告诉我的计算机信任Charles证书。但是一旦我做了,那个错误就消失了。您可能想要确认您没有使用干扰TLS / HTTPS请求的代理服务器或其他网络。

顺便说一句,我也建议:

  • 你应该defer满足期望(无论你从那个闭包中取出什么路径,它都会得到满足);和
  • 您可能希望降低纬度和经度错误检查的准确性(因为我发现我的结果差异很小)。

所以,或许类似于:

func testGeocoder() {
    let expectation = expectationWithDescription("Wait for geocode")
    CLGeocoder().geocodeAddressString("Infinite Loop 1, Cupertino") { placemarks, error in
        defer { expectation.fulfill() }

        guard error == nil else {
            XCTFail(error!.localizedDescription); return
        }

        guard let coordinate = placemarks?.first?.location?.coordinate else {
            XCTFail("No coordinate"); return
        }

        XCTAssertEqualWithAccuracy(coordinate.latitude, 37.3316851, accuracy: 0.001, "Latitude doesn't match")
        XCTAssertEqualWithAccuracy(coordinate.longitude, -122.0300674, accuracy: 0.001, "Longitude doesn't match")
    }
    waitForExpectationsWithTimeout(3, handler: nil)
}