2012-06-19 10 views
9

Tengo una función que llama al geolocalizador y no sé cómo probar esta función. Intenté espiar el geolocalizador y devolver los datos falsos, pero sin éxito, la función original todavía se usa y, por lo tanto, tendría que esperar y no podría usar datos simulados.Cómo falsificar llamadas de retorno desde el geolocalizador en jazmín

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

¿Cómo puedo hacer esto?

Respuesta

16

Cuando se llama al código de geolocalización, que se ve así:

navigator.geolocation.getCurrentPosition(onSuccess, onError); 

Esto significa que usted está llamando y pasarlo funciones:

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 
    } 

Entonces, si quieres espiar usando jazmín para devolver un valor, querrás llamar a la función de éxito usando el primer argumento de la llamada original como esta:

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

Si usted quiere hacer que parezca que se ha devuelto un error, te gustaría llamar a la función de error con el segundo argumento de la llamada original como esto:

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

Editar a mostrar todo el ejemplo:

Ésta es la función que esté utilizando Jasmine a prueba:

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 es que sería en su archivo de especificaciones:

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

En este punto, cuando se ejecuta la especificación, se le dirá que su servicio web que dio el código postal adecuado para la latitud y longitud que ha proporcionado si su servicio web trabaja apropiadamente.

+0

Acepté su respuesta, el problema es que mi código sigue llamando al geocodificador original y no el espía –

+0

Consulte la edición que agregué para obtener más aclaraciones. Espero que puedas ejecutar tus scripts de prueba de jazmín. :) –

0

Ah, espere, tal vez TIENE que crear el espía dentro de su bloque beforeEach porque Jasmine restaura espías automáticamente después de cada caso de prueba. si hiciste algo como:

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

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

el espía ya está restaurado cuando quieres probarlo. Use este lugar:

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

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

Por favor, edite su respuesta y no publique respuestas múltiples. En cualquier caso, creé el espía dentro de mi función it(), y los espías que creé de esta forma siempre funcionaron, el problema es que nunca devuelve los datos falsos –

Cuestiones relacionadas