2016-08-12 5 views
1

Codes sind aus Buch, Es ist immer in der ersten XCTFail() fehlgeschlagen, ich habe es auf Gerät und Simulator versucht, Es sollte nicht Netzwerkproblem sein, schauen Sie in den Fehler, es zeigt Optional(Error Domain=kCLErrorDomain Code=2 "(null)")Test CLGeocoder geocodeAddressString Methode Ortsmarken ist immer 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) 
} 

Antwort

2

Sie sagen, es ist nicht ein Netzwerkfehler sein soll, aber das ist genau das, was ein CLErrorDomain Fehler mit einem Code von 2 (CLError.Network). Sie können das aus einer Vielzahl von Gründen bekommen. Zum Beispiel habe ich es bekommen, als ich versuchte, die Kommunikation mit Charles zu überwachen, hatte aber meinem Computer noch nicht gesagt, dem Charles-Zertifikat zu vertrauen. Aber als ich das tat, verschwand dieser Fehler. Sie möchten möglicherweise bestätigen, dass Sie keinen Proxy-Server oder ein anderes Netzwerk verwenden, das TLS/HTTPS-Anforderungen stört.

Als beiseite, ich würde auch vorschlagen:

  • Sie sollten die Erfüllung der Erwartung defer (also unabhängig davon, erfüllt bekommt, was Weg Sie nehmen aus dieser Schließung); und
  • Sie könnten die Genauigkeit dieser Breiten- und Längengradfehlerprüfung reduzieren wollen (da ich meine Ergebnisse nur geringfügig unterschieden habe).

Also, vielleicht so etwas wie:

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

Ich würde sagen, es über meine Fähigkeit, ein Netzwerkproblem ist, ich dicide accidently die Adresse im Code mit meiner Heimatadresse gefüllt zu ersetzen und es funktioniert. Danke für deine Antwort, ich habe wirklich etwas aus dem Code gelernt, den du zur Verfügung gestellt hast:) –