我有一个调用geolocator的函数,我不知道如何测试这个函数。我试过监视地理定位器并返回假数据但没有成功,原来的功能仍在使用,所以我不得不等待,我不能使用模拟数据。
// this doesn't work
var navigator_spy = spyOn( navigator.geolocation, 'getCurrentPosition' ).andReturn( {
coords : {
latitude : 63,
longitude : 143
}
} );
我该怎么做?
答案 0 :(得分:18)
当您调用地理位置代码时,它看起来像这样:
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
}
所以,如果你想使用jasmine返回一个值来监视它,你需要使用原始调用的第一个参数调用success函数,如下所示:
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);
});
修改以显示完整示例:
这是您使用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');
});
});
});
此时,当您运行规范时,它会告诉您,如果您的网络服务正常运行,您的网络服务会为您提供正确的纬度和经度邮政编码。
答案 1 :(得分:0)
等等,也许你必须在beforeEach
区块中创建间谍,因为Jasmine会在每个测试用例后自动恢复间谍。如果你做了类似的事情:
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
});