2012-06-19 10 views
9

Mam funkcję, która wywołuje geolocator i nie wiem jak przetestować tę funkcję. Próbowałem już szpiegować geolokatora i zwracać fałszywe dane, ale bez powodzenia, pierwotna funkcja jest nadal używana, więc musiałbym czekać i nie mogłem użyć próbnych danych.Jak fałszywe połączenia zwrotne od geolocatora w jaśminu

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

Jak mogę to zrobić?

Odpowiedz

16

Po wywołaniu kodu geolokalizacji, wygląda to tak:

navigator.geolocation.getCurrentPosition(onSuccess, onError); 

Oznacza to, że jesteś nazywając go i przechodząc funkcjonuje:

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 
    } 

Tak więc, jeśli chcesz go śledzić za pomocą jaśminu zwracającego wartość, możesz wywołać funkcję sukcesu za pomocą pierwszego argumentu pierwotnego połączenia w następujący sposób:

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

Jeśli chcesz, aby wyglądał jak został zwrócony błąd, którą chcesz wywołać funkcję błędu przy użyciu drugiego argumentu oryginalnego rozmowy jak ta:

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

Edytuj do pokazać pełny przykład:

jest to funkcja używasz Jasmine do testu:

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 to byłoby w pliku spec:

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

w tym momencie, po uruchomieniu spec, powie to, że serwis internetowy dał ci odpowiedni kod pocztowy na szerokości i długości geograficznej podałeś, czy serwis internetowy działa poprawnie.

+0

Zaakceptowałem twoją odpowiedź, problem polega na tym, że mój kod ciągle wywołuje oryginalny geokoder a nie szpieg –

+0

Zobacz edytowaną przeze mnie edycję, aby uzyskać więcej wyjaśnień. Mam nadzieję, że uda ci się uruchomić skrypty testu jaśminu. :) –

0

Ach, czekaj, może musisz utworzyć szpiega w swoim bloku beforeEach, ponieważ Jasmine automatycznie przywraca szpiegów po każdym teście testowym. jeśli zrobiłeś coś takiego:

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

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

szpieg jest już przywrócony, gdy chcesz go przetestować. Użyj tego zamiast:

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

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

Edytuj swoją odpowiedź i nie publikuj wielu odpowiedzi. W każdym razie stworzyłem szpiega wewnątrz funkcji my it(), a szpiedzy, których stworzyłem w ten sposób zawsze działało, problem polega na tym, że nevber zwraca fałszywe dane. –

Powiązane problemy