我有一个函数调用geolocator,我不知道如何测试这个功能.我已经尝试间谍地理位置并返回假数据,但没有成功,原来的功能仍然使用,所以我必须等待,我不能使用模拟数据.
// this doesn't work var navigator_spy = spyOn( navigator.geolocation,'getCurrentPosition' ).andReturn( { coords : { latitude : 63,longitude : 143 } } );
我该怎么做?
解决方法
当你调用地理位置代码时,它看起来像这样:
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); });
如果你想让它看起来像一个错误返回,你想使用原始调用的第二个参数调用错误函数,"getCurrentPosition").andCallFake(function() { arguments[1](error); });
编辑显示完整示例:
这是您使用Jasmine测试的功能:
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); }); }
这将在你的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'); }); }); });
在这一点上,当您运行规范时,如果您的Web服务正常工作,它会告诉您,您的Web服务为您提供的纬度和经度提供了正确的邮政编码.