已经调用了Sinon Spy检查功能

时间:2016-11-21 10:17:25

标签: javascript testing mocha sinon

我正在尝试使用sinon.spy()来检查是否已调用某个函数。该函数名为getMarketLabel,它返回marketLabel并将其接受到函数中。我需要检查是否已调用getMarketLabel。我实际上在一个地方打电话给getMarketLabel,如下所示: {getMarketLabel(sel.get('market'))} 我到目前为止的代码是:

describe('Check if it has been called', () => {
  let spy;
  beforeEach(() => {
    spy = sinon.spy(getMarketLabel, 'marketLabel');
  })
  it('should have been called', () => {
    expect(spy).to.be.calledWith('marketLabel');
  });
});

这是我收到的错误: TypeError: Attempted to wrap undefined property marketLabel as function

2 个答案:

答案 0 :(得分:1)

Sinon无法监视不属于某个对象的属性的函数,因为Sinon必须能够通过该函数的间谍版本替换原始函数getMarketLabel

一个工作示例:

let obj = {
  getMarketLabel(label) {
    ...
  }
}
sinon.spy(obj, 'getMarketLabel');

// This would call the spy:
obj.getMarketLabel(...);

此语法(与您正在使用的内容接近)也存在:

let spy = sinon.spy(getMarketLabel);

但是,这只会在显式调用spy()时触发间谍代码;当你直接拨打getMarketLabel()时,根本不会调用间谍代码。

此外,这也不起作用:

let getMarketLabel = (...) => { ... }
let obj            = { getMarketLabel }
sinon.spy(obj, 'getMarketLabel');

getMarketLabel(...);

因为您仍在直接致电getMarketLabel

答案 1 :(得分:0)

  

这是我收到的错误:TypeError: Attempted to wrap undefined property marketLabel as function

您需要将helper.js放入测试文件中,然后替换所需模块上的相关方法,最后调用替换为spy的方法:

var myModule = require('helpers'); // make sure to specify the right path to the file

describe('HistorySelection component', () => {
  let spy;
  beforeEach(() => {
    spy = sinon.stub(myModule, 'getMarketLabel'); // replaces method on myModule with spy
  })
  it('blah', () => {
    myModule.getMarketLabel('input');
    expect(spy).to.be.calledWith('input');
  });
});

您无法测试是否使用helpers.sel('marketLabel')调用间谍,因为在执行测试之前将执行此功能。因此,您将写下:

expect(spy).to.be.calledWith(helpers.sel('marketLabel'));

测试是否使用helpers.sel('marketLabel')返回的任何值调用间谍(默认情况下为undefined)。

helper.js的内容应为:

module.exports = {
  getMarketLabel: function (marketLabel) {
    return marketLabel
  }
}