2012-06-19 13 views
9

Ich habe eine Funktion, die den Geolocator aufruft und ich weiß nicht, wie man diese Funktion prüft. Ich habe versucht, den Geolocator ausspionieren und falsche Daten zurückgeben, aber ohne Erfolg, die ursprüngliche Funktion wird immer noch verwendet und so musste ich warten, und ich konnte keine Scheindaten verwenden.Wie gefälschte Rückrufe vom geolocator in Jasmin

// this doesn't work   
var navigator_spy = spyOn(navigator.geolocation, 'getCurrentPosition').andReturn({ 
    coords : { 
     latitude : 63, 
     longitude : 143 
    } 
}); 

Wie kann ich das tun?

Antwort

16

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

navigator.geolocation.getCurrentPosition(onSuccess, onError); 

Das bedeutet, dass Sie es sind aufrufen und es funktioniert:

function onSuccess(position) { 
     // do something with the coordinates returned 
     var myLat = position.coords.latitude; 
     var myLon = position.coords.longitude; 
    } 

    function onError(error) { 
     // do something when an error occurs 
    } 

Wenn Sie also mit Jasmin einen Wert ausspionieren wollten, sollten Sie die Erfolgsfunktion mit dem ersten Argument des ursprünglichen Aufrufs wie folgt aufrufen:

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

Wenn Sie es so aussehen wie ein Fehler zurückgegeben wurde, würden Sie anrufen möchten, die Fehlerfunktion unter Verwendung des zweiten Argument des ursprünglichen Aufruf wie folgt machen wollte:

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

bearbeiten zu vollständiges Beispiel zeigen:

Dies ist die Funktion, die Sie Jasmine Test verwenden:

function GetZipcodeFromGeolocation(onSuccess, onError) { 
     navigator.geolocation.getCurrentPosition(function(position) { 
       // do something with the position info like call 
       // an web service with an ajax call to get data 
       var zipcode = CallWebServiceWithPosition(position); 
       onSuccess(zipcode); 
     }, function(error) { 
       onError(error); 
     }); 
    } 

Th ist in der Spec-Datei wäre:

describe("Get Zipcode From Geolocation", function() { 
     it("should execute the onSuccess function with valid data", 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'); 
       }); 
     }); 
    }); 

An diesem Punkt, wenn Sie die Spezifikation ausführen, wird es Ihnen sagen, dass Ihre Web-Service, den Sie die richtige Postleitzahl für den Breiten- und Längen Sie, wenn Sie Ihre Web-Service geliefert hat Funktioniert einwandfrei.

+0

Ich akzeptierte Ihre Antwort, das Problem ist, dass mein Code ruft den ursprünglichen Geocoder und nicht der Spion –

+0

Bitte beachten Sie die Bearbeitung, die ich für weitere Erläuterungen hinzugefügt habe. Ich hoffe, dass Sie Ihre Jasmin-Testskripte ausführen können. :) –

0

Ah warten Sie, vielleicht müssen Sie den Spion in Ihrem beforeEach Block erstellen, weil Jasmine Spione automatisch nach jedem Testfall wieder herstellt. Wenn Sie etwas getan haben wie:

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

it("should stub the navigator", function() { 
    // your test code 
}); 

der Spion ist bereits wiederhergestellt, wenn Sie es testen möchten. Verwenden Sie stattdessen:

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

it("should work now since the spy is created in beforeEach", function() { 
    // test code 
}); 
+0

Bitte bearbeiten Sie Ihre Antwort und geben Sie nicht mehrere Antworten ein. Auf jeden Fall habe ich den Spion in meiner Funktion it() erstellt, und Spione, die ich auf diese Weise erstellt habe, haben immer funktioniert, das Problem ist, dass es die falschen Daten zurückgibt –