我正在单元测试一个模块中定义的方法,它本身调用第二个模块中所定义的依赖项。我想使用Sinon包为被测方法对依赖项的调用设置一个间谍。我该怎么做?我看到了Sinon关于模拟模块依赖性的页面(参见此处),并且在过去能够成功使用它。但在这种情况下,我的测试代码(见下文)仍然调用原始方法,而不是间谍。
仅供参考,在我的代码中,如果我为方法分配一个Sinon存根,而不是Sinon spy,那么存根方法确实被调用了,正如预期的那样。我不确定为什么我可以存根,但在这种情况下不能间谍。
在这种情况下,使用存根
对于我的目的来说很好。但我很好奇为什么我不能像过去那样在这里使用间谍
。
谢了。
我的代码
combo-test.js(测试文件)
const { tape } = require('tape')
const sinon = require('sinon')
const { myCombo } = require('./lib/ow/combo')
const { ComboDropdown } = require('../../../lib/ow/combo-dropdown')
const comboObject = myCombo(props)// Instantiate object to expose method-under-test.
sinon.spy(ComboDropdown.prototype, 'extMethod')// Mock call to external method with a spy.
// sinon.stub(ComboDropdown.prototype, 'extMethod')
comboObj.myMethod()// Prints to console: 555
组合.js(定义测试方法)
const { ComboDropdown } = require('./combo-dropdown')
class Combo extends myClass {
constructor(props) {
}
myMethod() {// method-under-test
this.dropdown = new ComboDropdown({
})
this.dropdown.extMethod()//Calls external method.
}
}
const myCombo = props => new Combo(props)
module.exports = { myCombo }
combo-dropdown.js(定义外部方法)
class ComboDropdown extends Dropdown {
constructor(props) {
super(props)
}
extMethod() {
console.log(555)
}
}
module.exports = {
ComboDropdown
}
< code>sinon.spy(object," method")创建一个封装现有函数< code>object.method的spy。spy的行为与原始方法完全一样(包括用作构造函数时),但是您可以访问所有< code >调用的数据。
sinon。spy()
只将调用信息添加到目标方法,而不更改其行为或实现,将其保留为原始实现。使用调用信息,您可以在执行测试代码后进行断言,例如是否调用了方法。
如果您既想获得调用信息,又想更改目标方法的实现。< code>sinon.stub(object,' method')才是正确的方式。它将用一个存根函数替换< code>object.method。
此外,您可以使用这样的存根返回;
使存根返回提供的值的 API。