13 Stimmen

Wie man gefälschte Rückrufe vom geolocator in Jasmine macht

Ich habe eine Funktion, die den Geolocator aufruft, und ich weiß nicht, wie ich diese Funktion testen soll. Ich habe versucht, den Geolocator zu überwachen und gefälschte Daten zurückzugeben, aber ohne Erfolg, die Originalfunktion wird weiterhin verwendet und daher müsste ich warten und könnte keine Mock-Daten verwenden.

// das funktioniert nicht
var navigator_spy = spyOn( navigator.geolocation, 'getCurrentPosition' ).andReturn( {
    coords : {
        latitude : 63,
        longitude : 143
    }
} );

Wie kann ich das machen?

22voto

Will Grams Punkte 401

Wenn Sie den Geolocation-Code aufrufen, sieht es so aus:

  navigator.geolocation.getCurrentPosition(onSuccess, onError);

Dies bedeutet, dass Sie ihn aufrufen und ihm Funktionen übergeben:

  function onSuccess(position) {
      // etwas mit den zurückgegebenen Koordinaten machen
      var myLat = position.coords.latitude;
      var myLon = position.coords.longitude;
  }

  function onError(error) {
      // etwas machen, wenn ein Fehler auftritt
  }

Wenn Sie also möchten, dass Jasmine einen Wert zurückgibt, würden Sie die Erfolgsfunktion mit dem ersten Argument des ursprünglichen Aufrufs aufrufen, so:

  spyOn(navigator.geolocation,"getCurrentPosition").andCallFake(function() {
         var position = { coords: { latitude: 32, longitude: -96 } };
         arguments[0](position);
  });

Wenn Sie wollen, dass es aussieht, als wäre ein Fehler zurückgegeben worden, möchten Sie die Fehlerfunktion mit dem zweiten Argument des ursprünglichen Aufrufs aufrufen, so:

  spyOn(navigator.geolocation,"getCurrentPosition").andCallFake(function() {
         arguments[1](error);
  });

Bearbeiten um vollständiges Beispiel anzuzeigen:

Dies ist die Funktion, die Sie mit Jasmine testen:

  function GetZipcodeFromGeolocation(onSuccess, onError) {
        navigator.geolocation.getCurrentPosition(function(position) {
              // etwas mit den Positionsinfos machen wie z.B. 
              // einen Webservice mit einem Ajax-Aufruf aufrufen, um Daten zu erhalten
              var zipcode = CallWebServiceWithPosition(position);
              onSuccess(zipcode);
        }, function(error) {
              onError(error);
        });
  }

Dies würde in Ihrer Spezifikationsdatei sein:

  describe("Postleitzahl aus Geolocation erhalten", function() {
        it("soll die onSuccess-Funktion mit gültigen Daten ausführen", function() {
              var jasmineSuccess = jasmine.createSpy();
              var jasmineError = jasmine.createSpy();

              spyOn(navigator.geolocation,"getCurrentPosition").andCallFake(function() {
                     var position = { coords: { latitude: 32.8569, longitude: -96.9628 } };
                     arguments[0](position);
              });

              GetZipcodeFromGeolocation(jasmineSuccess, jasmineError);

              waitsFor(jasmineSuccess.callCount > 0);

              runs(function() {
                    expect(jasmineSuccess).wasCalledWith('75038');
              });
        });
  });

Zu diesem Zeitpunkt wird Ihnen der Test mitteilen, dass Ihr Webservice Ihnen die richtige Postleitzahl für die von Ihnen bereitgestellte Breiten- und Längengräbe gegeben hat, wenn Ihr Webservice ordnungsgemäß funktioniert.

1voto

DominikGuzei Punkte 589

Ah warte, vielleicht MUSST du den Spion innerhalb deines beforeEach Blocks erstellen, da Jasmine Spione automatisch nach jedem Testfall wiederherstellt. Wenn du etwas wie folgt gemacht hast:

var navigator_spy = spyOn( navigator.geolocation, 'getCurrentPosition' )

it("sollte den Navigator ersetzen", function() {
   // dein Testcode
});

ist der Spion bereits wiederhergestellt, wenn du ihn testen möchtest. Verwende stattdessen dies:

beforeEach(function() {
    this.navigatorSpy = spyOn( navigator.geolocation, 'getCurrentPosition' )
});

it("sollte jetzt funktionieren, da der Spion in beforeEach erstellt wird", function() {
    // Testcode
});

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X