Jquery .find()在Backbone视图中返回undefined

时间:2014-05-08 13:39:03

标签: jquery backbone.js jasmine

我使用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。有什么想法可能会发生什么?

1 个答案:

答案 0 :(得分:0)

我在spyOn()结束时遗漏了andCallThrough()。所以它应该是:

spyOn($.fn, 'find').andCallThrough();

它现在正在工作。