2016-11-21 70 views
0

我试图使用sinon.spy()来检查函数是否已被调用。该函数被称为getMarketLabel,它返回marketLabel并将其接受到函数中。我需要检查getMarketLabel已被调用。我实际调用getMarketLabel在一个地方,像这样: {getMarketLabel(sel.get('market'))} 我到目前为止的代码是:Sinon Spy检查函数被称为

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

回答

1

兴农无法窥视功能,那不是某个对象的属性,因为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

+0

请参见本文的jsfiddle:https://jsfiddle.net/hv8mLwcL/ – DaveDavidson

+0

@DaveDavidson'sinon.spy(getMarketLabel, 'marketLabel' )'无效:'getMarketLabel'不是一个对象,'marketLabel'不是一个函数。 – robertklep

0

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

您需要要求helper.js到您的测试文件,然后替换相关的方法所需要的模块,最后调用与替代方法谍照:

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 
    } 
} 
+0

虽然我不确定应该在助手文件中。目前这是我的:https://jsfiddle.net/8q1tLhs7/ 而且我仍然收到相同的错误。 – DaveDavidson

+0

@DaveDavidson:查看更新的答案。不确定你为什么做一个无效语法的'return {getMarketLabel}'。我将它改为'return marketLabel'。 – rabbitco

+0

这不适合我。我仍然得到同样的错误。 – DaveDavidson