2012-06-19 15 views
9

Ho una funzione che chiama il geolocalizzatore e non so come testare questa funzione. Ho provato a spiare il geolocalizzatore e restituire dati falsi, ma senza successo, la funzione originale è ancora utilizzata e quindi dovrei aspettare e non riuscire a utilizzare i dati falsi.Come falsificare le chiamate di ritorno dal geolocator in gelsomino

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

Come posso fare questo?

risposta

16

Quando si chiama il codice di geolocalizzazione, sembra che questo:

navigator.geolocation.getCurrentPosition(onSuccess, onError); 

Ciò significa che si sta chiamando e passandolo funzioni:

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 
    } 

Quindi, se volessi spiarlo usando jasmine restituendo un valore, vorrai chiamare la funzione success usando il primo argomento della chiamata originale in questo modo:

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

Se si voleva far sembrare un errore è stato restituito, che ci si vuole chiamare la funzione di errore usando il secondo argomento della chiamata originale in questo modo:

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

Modifica a Visualizza tutti i esempio:

Questa è la funzione che si sta utilizzando Jasmine di prova:

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 è sarebbe nel file 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'); 
       }); 
     }); 
    }); 

A questo punto, quando si esegue la specifica, vi dirà che il vostro servizio web ti ha dato il codice postale corretto per la latitudine e la longitudine Lei forniti se il vostro servizio web funziona correttamente

+0

Ho accettato la tua risposta, il problema è che il mio codice continua a chiamare il geocoder originale e non la spia –

+0

Si prega di consultare la modifica che ho aggiunto per ulteriori chiarimenti. Spero che tu sia in grado di eseguire i tuoi script di test sui gelsomini. :) –

0

Ah aspetta, forse devi creare la spia all'interno del tuo blocco beforeEach perché Jasmine ripristina automaticamente le spie dopo ogni caso di test. se hai fatto qualcosa di simile:

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

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

la spia è già ripristinata quando si vuole testarlo. Usare questo invece:

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

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

Si prega di modificare la risposta e non pubblicare più risposte. In ogni caso ho creato la spia all'interno della mia funzione it() e le spie che ho creato in questo modo hanno sempre funzionato, il problema è che non restituisce i dati falsi –

Problemi correlati