您好,我对Javascript和jasmine有点缺乏经验,我正在尝试为javascript对象编写一些简单的测试。
var googleMap = {
geoCode: function(code, fn) {
var geocoder = new google.maps.Geocoder();
geocoder.geocode({
'address': code
}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
fn(results[0].geometry.location);
} else {
alert("ALL IS LOST");
}
})
},
render: function(LatLng) {
var mapOptions = {
zoom: 8,
center: LatLng
}
map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
var marker = new google.maps.Marker({
map: map,
position: LatLng
});
}
};
- 这是我的茉莉花剧本;我试图确保每当我们运行地理编码功能时都会调用render函数...
describe("Testing of googleMap.js", function() {
it("Test GeoCode", function() {
var input = "Columbus";
spyOn(googleMap, 'render');
googleMap.geoCode(input, googleMap.render);
expect(googleMap.render).toHaveBeenCalled();
});
});
每当我运行这个时,我的specRunner都会返回一个错误,声称期望声称的间谍渲染已经被调用,我有点困惑,为什么它不会......我是怎么做的我试图建立我的间谍,或者是我无法测试的javascript对象。我无法找到类似的例子来工作。
答案 0 :(得分:1)
对象.geocode
的方法google.maps.Geocoder
异步
因此,在检查回调函数是否已执行时,您没有收到回复,这意味着您的函数将不会被调用。
如果您只想测试是否会调用该函数,那么您可以执行以下操作:
describe("Testing of googleMap.js", function() {
it("Test GeoCode", function(done) {
var input = "Columbus";
googleMap.geoCode(input, function() {
// here you know that your callback function was called
done();
});
});
});
或如果您仍想使用模拟功能,可以执行此操作(使用jasmine 2.0):
describe("Testing of googleMap.js", function() {
it("Test GeoCode", function(done) {
var input = "Columbus";
var callbackSpy = jasmine.createSpy("callback").and.callFake(function() {
done();
});
googleMap.geoCode(input, callbackSpy);
});
});
使用给定的代码块,如果没有调用回调函数,则会出现超时错误:
Error: Timeout - Async callback was not invoked within timeout specified by jasmine.DEFAULT_TIMEOUT_INTERVAL.
这是 demo (使用模拟谷歌地理编码器)。