Jasmine测试对象方法
Jasmine test for object methods
你好,我对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对象。我很难找到类似的例子。
对象google.maps.Geocoder
的方法.geocode
是异步
因此,在检查回调函数是否执行时,您还没有得到响应,这意味着您的函数将不会被调用。
如果你只想测试函数是否会被调用,那么你可以做如下操作:
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();
});
});
});
或者如果你仍然想使用mock函数,你可以这样做(使用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.
这是一个演示(带有一个模拟的谷歌地理编码器)。
这就是修复代码的方法。问题是:做这样的测试合理吗
在单元测试中,您应该测试与其他资源分离的代码(如谷歌地理编码器)。因此,在这种情况下,imho最好模拟地理编码器对象,并测试是否使用正确的参数调用了mock。
相关文章:
- 序列化数据属性中对象的最可靠方法
- 有没有一种方法可以添加相同的项目val=“0”;4〃;到JavaScript中数组的每个对象
- 如何从对象的原型方法访问JavaScript对象属性
- 为什么不推荐使用“with”?是否有更好或其他方法可以“下降”到对象的命名空间
- 设置嵌套对象属性的更好方法
- JQuery示例不起作用-“;对象没有't支持属性或方法'按钮'&”;
- 对象不支持属性或方法“自动完成”
- call()和apply()实际上是用来欺骗方法处理类似数组的对象的
- 对象文字方法上的Javascript绑定不起作用
- Meteor应用程序无法运行-对象#<编译器>没有方法'主机'
- 为什么我可以在Array属性对象中找到Javascript Array for Each方法
- Underscore.js某些对象的所有方法的总和
- 对象#<XMLHttpRequest>没有方法'完成'
- Es6:能够在设置/更新/删除对象属性时调用自定义方法
- 丢失对象“;这个“;方法中的上下文
- 如何在ajax中调用javascript对象的方法
- 为什么页面方法对象未定义
- 如何使用在另一个文件中定义的JavaScript方法/对象
- 如何告诉JsHint忽略“未解析的函数或方法”?对象上的警告
- 使用jinja/javascript动态创建方法/对象