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

Javascript 使用Jasmine在对象上测试事件处理程序,javascript,testing,javascript-events,event-handling,jasmine,Javascript,Testing,Javascript Events,Event Handling,Jasmine,我有一门课,像: MyClass = function() { var view = { delegateEvents: function () { this.$el.on('click', 'input[type="radio"]', this.toggleServices); }, toggleServices: function () { … }, ren

我有一门课,像:

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();
});
现在的问题是,在测试中,没有调用spy,但代码进入类的原始
toggleServices()
,而不是spy。似乎我不明白如何创建一个间谍,它会在
init()
中向
this.toggleServices
发送请求


有什么建议吗?

您应该在设置侦听器之前进行监视,换句话说,就是在调用呈现之前进行监视

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();
});

您应该在设置侦听器之前进行监视,换句话说,就是在调用render之前进行监视

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();
});

您应该在设置侦听器之前进行监视,换句话说,就是在调用render之前进行监视

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();
});

您应该在设置侦听器之前进行监视,换句话说,就是在调用render之前进行监视

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();
});

对不起,忘记接受答案了。这当然是问题所在。对不起,忘记接受答案了。这当然是问题所在。对不起,忘记接受答案了。这当然是问题所在。对不起,忘记接受答案了。当然这就是问题所在。