如何为 class 中定义的依赖项而不是 Sinon 存根设置 Sinon 间谍?
How to set a Sinon spy for a dependency defined in a class, rather than a Sinon stub?
我正在对模块中定义的方法进行单元测试,该方法本身调用第二个模块中定义的依赖项。我想使用 Sinon 包为被测方法对依赖项的调用设置一个间谍。我怎么做?我看过 Sinon 关于模拟模块依赖性的页面 (see here),并且过去能够成功使用它。但在这种情况下,我的测试代码(见下文)仍在调用原始方法,而不是间谍。
仅供参考,在我的代码中,如果我将 Sinon stub 分配给该方法,而不是 Sinon spy,那么存根方法是确实如预期的那样调用。我不确定为什么在这种情况下我可以存根,但不能监视。
在这种情况下,使用 stub
就可以满足我的目的。但我很好奇为什么我不能像过去那样在这里使用 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
combo.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
}
sinon.spy(object, "method")
creates a spy that wraps the existing function object.method
. The spy will behave exactly like the original method (including when used as a constructor), but you will have access to data about all calls
.
sinon.spy()
只需将 calls 信息添加到目标方法中,而不更改其行为或实现,保留其原始实现。有了调用信息,就可以在执行被测代码后进行断言,比如方法是否被调用。
如果你想既有调用信息又想改变目标方法的实现。 sinon.stub(object, 'method')
是正确的方法。它将用存根函数替换 object.method
。
此外,您可以使用stub.returns(obj);
API 使存根return 成为提供的值。
我正在对模块中定义的方法进行单元测试,该方法本身调用第二个模块中定义的依赖项。我想使用 Sinon 包为被测方法对依赖项的调用设置一个间谍。我怎么做?我看过 Sinon 关于模拟模块依赖性的页面 (see here),并且过去能够成功使用它。但在这种情况下,我的测试代码(见下文)仍在调用原始方法,而不是间谍。
仅供参考,在我的代码中,如果我将 Sinon stub 分配给该方法,而不是 Sinon spy,那么存根方法是确实如预期的那样调用。我不确定为什么在这种情况下我可以存根,但不能监视。
在这种情况下,使用 stub
就可以满足我的目的。但我很好奇为什么我不能像过去那样在这里使用 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
combo.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
}
sinon.spy(object, "method")
creates a spy that wraps the existing functionobject.method
. The spy will behave exactly like the original method (including when used as a constructor), but you will have access to data about allcalls
.
sinon.spy()
只需将 calls 信息添加到目标方法中,而不更改其行为或实现,保留其原始实现。有了调用信息,就可以在执行被测代码后进行断言,比如方法是否被调用。
如果你想既有调用信息又想改变目标方法的实现。 sinon.stub(object, 'method')
是正确的方法。它将用存根函数替换 object.method
。
此外,您可以使用stub.returns(obj);
API 使存根return 成为提供的值。