2012-06-19 1 views
9

У меня есть функция, которая вызывает геолокатор, и я не знаю, как проверить эту функцию. Я пытался шпионить за геолокатором и возвращать поддельные данные, но без успеха исходная функция все еще используется, поэтому мне придется подождать, и я не смог бы использовать макет данных.Как подделывать обратные вызовы от геолокатора в жасмине

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

Как это сделать?

ответ

16

При вызове геолокации код, он выглядит следующим образом:

navigator.geolocation.getCurrentPosition(onSuccess, onError); 

Это означает, что вы вызываете его и передавая его функции:

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 
    } 

Итак, если вы хотите следить за ним, используя жасмин, возвращающий значение, вам нужно вызвать функцию успеха, используя первый аргумент исходного вызова, например:

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

Если вы хотите, чтобы она выглядела как была возвращена ошибка, вы хотите вызвать функцию ошибки, используя второй аргумент исходного вызова, как это:

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

Edit к показать полный пример:

Это функция, которую вы используете для Жасмин тест:

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 это будет в файле спецификации:

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

В этот момент, когда вы запускаете спецификации, он скажет вам, что ваш веб-сервис дал вам правильный почтовый индекс для широты и долготы, которую вы предоставили, если ваш веб-сервис работает правильно.

+0

Я принял ваш ответ, проблема в том, что мой код продолжает ссылаться на оригинальный геокодер а не шпионом –

+0

См. изменение, которое я добавил для получения дополнительных разъяснений. Надеюсь, вы сможете запустить скрипты теста жасмина. :) –

0

Ах, подождите, возможно, вам нужно создать шпиона в вашем блоке beforeEach, потому что Жасмин автоматически восстанавливает шпионов после каждого теста. если вы сделали что-то вроде:

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

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

шпион уже восстановлен, когда вы хотите его протестировать. Используйте вместо этого:

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

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

Пожалуйста, отредактируйте ваш ответ и не публикуйте несколько ответов. В любом случае я создал шпиона внутри моей функции it(), и шпионы, которые я создал таким образом, всегда работали, проблема в том, что он не вернет поддельные данные –