我有一个主干视图,我想创建一个测试来确认某个元素上的click事件将调用绑定到该元素的函数。
我的看法是:

PromptView = Backbone.View.extend({
        id:"promptPage",
        attributes:{
            "data-role":"page",
            "data-theme":"a"
        },
        events:{
            "click #btnYes":    "answerYes",
            "tap #btnYes":      "answerYes"
        },
        render: function(){
            $(this.el).html(_.template($('#promptPage-template').html(), this.model.toJSON()));

            return this;
        },
        answerYes: function(){
            alert('yes');
        }
    });


我的规格是:

beforeEach(function() {
            model = new PromptModel;
            view = new PromptView({model:model});
            loadFixtures('promptPage.tmpl');
        });

 it("should be able to answer a question with yes", function() {
                var button = $("#btnYes", view.render().el);
                expect(button.length).toBe(1);

                spyOn(view, 'answerYes');

                button.click();
                expect(view.answerYes).toHaveBeenCalled();

            });


但是,上面的视图定义在原型proto上创建了answerYes方法,但是间谍在视图中的实际实例上创建了一个函数,因此我最终得到了一个view.answerYes(),它是间谍和view .__ proto __。answerYes,这是我实际上要监视的那个。

如何创建间谍,使其覆盖视图定义的answerYes方法?

最佳答案

嗨,我今天有同样的问题。我刚刚找到了解决方案,创建了间谍方法(answerYes)之后,您必须刷新视图的事件才能调用该新的间谍方法;):

[...]

spyOn(view,'answerYes');
view.delegateEvents();

button.click();
Expect(view.answerYes).toHaveBeenCalled();

[...]


More information about delegate events

玩得开心!

10-08 03:16