当前位置: 首页 > 知识库问答 >
问题:

如何为类中定义的依赖项设置Sinon spy,而不是Sinon stub?

卫胜
2023-03-14

我正在单元测试一个模块中定义的方法,它本身调用第二个模块中所定义的依赖项。我想使用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
}

共有1个答案

颜霖
2023-03-14

< code>sinon.spy(object," method")创建一个封装现有函数< code>object.method的spy。spy的行为与原始方法完全一样(包括用作构造函数时),但是您可以访问所有< code >调用的数据

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

如果您既想获得调用信息,又想更改目标方法的实现。< code>sinon.stub(object,' method')才是正确的方式。它将用一个存根函数替换< code>object.method。

此外,您可以使用这样的存根返回;使存根返回提供的值的 API。

 类似资料:
  • 如何告诉Storm使用包含在fat jar中的依赖项而不是Storm类路径中的依赖项? 以下是一些背景/细节: 是中包含的2.0和fat JAR中包含的2.7的依赖项。 使用运行拓扑似乎可以使用2.7。 使用提交拓扑似乎使用2.0而不是2.7。 是使用创建的: 在的依赖项部分下 执行时,会发现2.7的正确joda时间戳 我之所以注意到这一点,是因为我在通过命令提交拓扑时看到以下警告/错误:

  • 问题内容: 假设我想在项目中添加guice-assistedinject作为依赖项。它将guice工件指定为依赖项本身。如何告诉它使用guice的no_aop版本? 我知道我可以执行以下操作,但是我可以一步完成而不排除guice模块吗? 问题答案: 没有更简单的解决方案。您可以使用简短的依赖性表示法(例如)来缩短代码。

  • 我正在开发一个Java项目,使用maven作为依赖项管理器/构建工具。我当前在将依赖项的依赖项解析到正确版本时遇到问题。 有问题的依赖项称为JasperReports-Functions-6.1.0.jar,它不是托管在maven repo中,而是以jar形式提供的。 如何强制jar依赖项使用子依赖项的某个版本?

  • 我遇到了一个奇怪的问题,我的Maven文件中有两个依赖项,它们都定义了。我遇到的问题是,我的一个依赖项显然使用了代码所期望的不同版本,它会抛出and错误。 我的代码正在从Tika依赖项获取类,这导致了问题。我希望它来自我定义的,这是正确的版本。它似乎也忽略了文件中依赖项的排序。

  • 问题内容: 我正在开发一个Portlet,可以在其中对SQL Server数据库进行Hibernate访问。我为此设置了 maven依赖项 ,并尝试以与MySql相同的方式找出SQL Server连接器。 如果我搜索SQL Server连接器,我的Google搜索仍然仅提供Mysql。正确的 maven依赖项 值是多少? 问题答案: 从Olaf提供的链接下载驱动程序JAR,并将其添加到本地Mave