1

我正在使用 Jasmine 和 Sinon 来测试我的 Backbone 应用程序,但我遇到了一些麻烦。我正在尝试测试初始化​​视图时是否调用了渲染

我有以下观点:

var MyView = Backbone.View.extend({
    el: '#myElement',
    initialize : function() {
        var that = this;
        this.collection.fetch({
            error : function() {
                alert("error!");
            },
            success : function() {
                that.render();
            }
        });
    },

    render : function() {
        this.collection.each(this.renderItem);
    }

    ...

我的测试

it('Should call render when view is instantiated', function(){          
                spyOn(MyView.prototype, 'render');
                var myCollection = new MyCollection();
                this.view = new MyView({collection: myCollection});
                expect(MyView.prototype.render).toHaveBeenCalled();
        });

问题是在我的 fetch 的成功回调执行之前调用了 expect()。解决此问题的最佳方法是什么?

4

1 回答 1

2

所以这里的问题是你测试了两件事,视图和集合。您应该存根集合并仅测试视图:

sinon.stub(myCollection, 'fetch').yieldsTo('success') // will immediately call the success methode
sinon.stub(myCollection, 'each').callsArg(0) // will immediately call this.renderItem

监视您要测试的课程也不是一个好主意。在您的情况下,您应该测试视图的 innerHTMl 在this.renderItem调用后是否已按预期更改

于 2013-04-05T08:42:30.260 回答