监视点击事件所调用的功能

时间:2015-07-27 12:39:20

标签: javascript mocha sinon chai karma-mocha

我做错了什么?试图窥探在元素click事件上调用的函数,但测试总是返回false。

规格:

describe('button', function() {
  before(function() {
    this.spy = sinon.spy(window, 'testMethod');
  });

  it('Should call testMethod', function() {
    $('#testBtn').click();

    expect(this.spy.called).to.equal(true);
  });
});

JS:

$('#testBtn').on('click', testMethod);

function testMethod() {
  return true;
}

2 个答案:

答案 0 :(得分:0)

尝试

expect(this.spy).to.have.been.called();

而不是

expect(this.spy.called).to.equal(true);

答案 1 :(得分:0)

问题是由于这一行:

$('#testBtn').on('click', testMethod);

在设置间谍之前获取对testMethod的引用。所以它抓住了对原始函数的引用,而不是间谍,然后在window.testMethod上设置间谍并不重要,因为在click事件上调用的函数总是原来的{{1} }。您有几个选项可以让您的测试起作用:

  1. 之后运行testMethod ,设置间谍。例如,您可以将其放在$('#testBtn').on('click', testMethod);挂钩中。

  2. before更改为$('#testBtn').on('click', testMethod);。每次处理点击事件时,匿名函数都会获取对$('#testBtn').on('click', function () { testMethod(); });的新引用。所以一旦你设置它,它就会抓住对间谍的引用。

  3. 我已经通过创建复制代码并使用上述两个修复的测试来测试我在这里所说的内容。