【问题标题】:test CLGeocoder geocodeAddressString method placemarks is always nil测试 CLGeocoder geocodeAddressString 方法地标始终为零
【发布时间】:2016-08-12 05:39:24
【问题描述】:

代码来自书,第一次XCTFail()总是失败,我在设备和模拟器上都试过了,应该不是网络问题,查看错误,它显示Optional(Error Domain=kCLErrorDomain Code=2 "(null)")

func test_GeocoderWorksAsExpected() {
    let expectation = expectationWithDescription("Wait for geocode")
    CLGeocoder().geocodeAddressString("Infinite Loop 1, Cupertino") {
        (placemarks, error) -> Void in
        let placemark = placemarks?.first

        let coordinate = placemark?.location?.coordinate
        guard let latitude = coordinate?.latitude else {
            XCTFail(); return
        }
        guard let longitude = coordinate?.longitude else {
            XCTFail(); return
        }
        XCTAssertEqualWithAccuracy(latitude, 37.3316851, accuracy: 0.000001)
        XCTAssertEqualWithAccuracy(longitude, -122.0300674, accuracy: 0.000001)

        expectation.fulfill()
    }
    waitForExpectationsWithTimeout(3, handler: nil)
}

【问题讨论】:

    标签: ios swift unit-testing clgeocoder


    【解决方案1】:

    您说这不应该是网络错误,但这正是代码为 2 的 CLErrorDomain 错误 (CLError.Network)。您可以出于多种原因得到它。例如,当我尝试监视与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)
    }
    

    【讨论】:

    • 我会说这是一个超出我能力范围的网络问题,我不小心将代码中填写的地址替换为我的家庭地址并且它有效。感谢您的回答,我真的从您提供的代码中学到了一些东西:)
    猜你喜欢
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    相关资源
    最近更新 更多