使用Jasmine测试对象上的事件处理程序

时间:2014-08-29 16:07:37

标签: javascript testing javascript-events event-handling jasmine

我有一个类:

MyClass = function() {
    var view = {
        delegateEvents: function () {
            this.$el.on('click', 'input[type="radio"]', this.toggleServices);
        },
        toggleServices: function () {
            …
        },
        render: function () {
            blah-blah-blag (rendering the view)…
            this.delegateEvents();
        }
    };
    view.init();
    return view;
}

(我如何获得$el超出了问题的范围,但请确保它有效) 我在Jasmine中测试这个类的实例,如:

it('it handles clicks on radio buttons', function () {
    var view = new MyClass();
    view.render();

    spyOn(view, 'toggleServices');
    view.$('input[type="radio"]').eq(0).click();
    expect(view.toggleServices).toHaveBeenCalled();
});

现在的问题是,在测试中,没有调用间谍,但是代码进入了类的原始toggleServices()而不是间谍。似乎我不明白如何创建一个间谍,以便在this.toggleServices init()中向{{1}}提出请求。

有什么建议吗?

1 个答案:

答案 0 :(得分:3)

你应该在设置监听器之前监视,换句话说,在调用渲染之前只是间谍。

it('it handles clicks on radio buttons', function () {
    var view = new MyClass();
    spyOn(view, 'toggleServices');
    view.render();

    view.$('input[type="radio"]').eq(0).click();
    expect(view.toggleServices).toHaveBeenCalled();
});