我使用Jasmine.js在Backbone视图(称为DialogView)中单元测试函数。在DialogView中测试的功能是:
wireScroll: function() {
var self = this;
var wrapper = self.$el.find('.iscrollWrapper').get(0);
...
},
我想检查.find是否被调用。
it('jquery find called', function () {
theView = new DialogView();
theView.render();
spyOn($.fn, 'find');
theView.wireScroll();
expect($.fn.find).toHaveBeenCalled();
});
但是,我在视图中遇到一个非常奇怪的问题:
Cannot read property 'get' of undefined
因此在视图中,.find()失败,因此.get()失败。所以我做了一些测试和日志:
it('jquery find called', function () {
theView = new DialogView();
theView.render();
console.log('in unit test and theView.$el[0].outerHTML is ');
console.log(theView.$el[0].outerHTML);
console.log('in unit test, finding .iscrollWrapper');
console.log(theView.$el.find('.iscrollWrapper'));
});
在视图中:
wireScroll: function() {
var self = this;
console.log('in wireScroll and self.$el[0].outerHTML is ');
console.log(self.$el[0].outerHTML);
console.log('in wireScroll, finding .iscrollWrapper');
console.log(self.$el.find('.iscrollWrapper'));
},
单元测试中的outerHTML和视图的结果可以预测相同。两者都包含一个div元素,其类为'iscrollWrapper'。
在单元测试中,.find()的日志结果为:
in unit test, finding .iscrollWrapper
[div.iscrollWrapper, prevObject: jQuery.fn.jQuery.init[1], context: undefined, selector: ".iscrollWrapper", constructor: function, init: function…]
然而,在视图中,我得到:
in wireScroll, finding .iscrollWrapper
undefined
这没有任何意义,因为两者的outerHTML日志显示有一个带有“iscrollWrapper”类的div。有什么想法可能会发生什么?
答案 0 :(得分:0)
我在spyOn()结束时遗漏了andCallThrough()。所以它应该是:
spyOn($.fn, 'find').andCallThrough();
它现在正在工作。