2016-08-12 13 views
1

代碼來自圖書,它在第一個XCTFail()中總是失敗,我在設備和模擬器上都試過了,它不應該是網絡問題,查看錯誤,它會顯示Optional(Error Domain=kCLErrorDomain Code=2 "(null)")測試CLGeocoder geocodeAddressString方法地標始終爲零

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) 
} 

回答

2

你說這不應該是一個網絡錯誤,但是這正是一個CLErrorDomain誤差爲2的代碼是(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) 
} 
+0

我會說這是一個網絡的問題,超出了我的能力,我無意中dicide更換填充代碼與我的家庭地址的地址和它的作品。感謝您的回答,我真的從您提供的代碼中學到了一些東西:) –