【问题标题】:How to set a Sinon spy for a dependency defined in a class, rather than a Sinon stub?如何为类中定义的依赖项设置 Sinon 间谍,而不是 Sinon 存根?
【发布时间】:2021-06-21 12:24:43
【问题描述】:

我正在对模块中定义的方法进行单元测试,该方法本身调用在第二个模块中定义的依赖项。我想使用 Sinon 包为被测方法对依赖项的调用设置一个间谍。我怎么做?我看过Sinon关于模拟模块依赖的页面(see here),并且过去能够成功使用它。但在这种情况下,我的测试代码(见下文)仍在调用原始方法,而不是 spy。

仅供参考,如果我将 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
}

【问题讨论】:

    标签: javascript unit-testing sinon stub


    【解决方案1】:

    sinon.spy(object, "method") 创建一个封装现有函数object.method 的间谍。 spy 的行为将与原始方法完全相同(包括用作构造函数时),但您将可以访问有关所有 calls 的数据。

    sinon.spy() 只需将calls 信息添加到目标方法,而不更改其行为或实现,保留其原始实现。通过调用信息,您可以在执行被测代码后进行断言,例如方法是否被调用。

    如果您想同时拥有调用信息并更改目标方法的实现。 sinon.stub(object, 'method') 是正确的方法。它将用存根函数替换object.method

    此外,您可以使用 stub.returns(obj); 这样的 API 使存根返回提供的值。

    【讨论】:

    • 好的,现在一切正常,谢谢。直到现在,出于某种原因,我的印象是sinon.spy() 会添加调用信息用 noop 替换模拟函数,即完全阻止原始函数运行。但是你说的完全有道理。现在能清楚这一切真是太好了。谢谢!
    猜你喜欢
    • 2019-05-13
    • 2021-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-30
    • 2018-08-16
    • 2015-01-11
    • 2015-11-28
    相关资源
    最近更新 更多