【问题标题】:sinon spy not detecting a function callsinon spy 未检测到函数调用
【发布时间】:2017-02-12 18:00:39
【问题描述】:

我正在尝试使用 sinonJS 框架进行 nodeJS 单元测试。问题是,我根本无法让诗乃间谍工作。这是我的代码:

const callback = sinon.spy(someModule.callback)

mainModule.doSomethingFunction() //someModule.callback function is called inside this function

assert(callback.calledOnce, 'callback should be called once')

它只是失败了:

AssertionError:回调应该被调用一次

但是我正在登录应该调用的函数,它清楚地表明它正在被调用,sinon 间谍只是没有检测到它。不知道怎么了?

【问题讨论】:

  • 如果您在问题中包含的是所有被测代码,则不会调用它。你创建了间谍,然后什么都不做。
  • 我编辑了问题:我在回调中添加了应该被监视的函数。间谍的目的不就是窥探,而不是用它做点什么吗?我以为spy只是spy,然后我可以测试它窥探的函数是否被调用?
  • @VilleMiekk-oja 是的,但您的代码中没有任何内容调用过callback。也许它应该作为参数传递给doSomethingFunction
  • 在 mainModule.doSomethingFunction 内部调用。在 mainModule.doSomethingFunction 内部,它调用 someModule.callback 函数

标签: javascript node.js sinon chai


【解决方案1】:

要将对象方法包装在 spy 中,您可以像这样使用sinon

const callback = sinon.spy(someModule, 'callback');
mainModule.doSomethingFunction();
assert(callback.calledOnce, 'callback should be called once');
callback.restore();

请注意,当您完成解包间谍程序后,您应该调用restore

【讨论】:

  • 不起作用 =/。它只是没有检测到回调,即使我写的和你写的一模一样
  • 在一些节点流的单元测试中它对我来说很好。文档是here。如果你不能让它工作,你需要在你的问题中包含一个minimal reproducible example,因为你的问题包含很少的代码。
  • 一个区别是,我们将 ASI 与 node.js 一起使用。自动分号插入。也许这会影响 sinon,所以它不会检测到函数调用?
  • 另外,我们使用dirty-chai和chai
  • 请看我与主题相关的新问题:stackoverflow.com/questions/39868119/…,你也许可以解决它
【解决方案2】:

const callback = sinon.spy(someModule.callback) 语句创建了一个间谍,一旦调用它就会调用someModule.callback(顺便说一句,它不是一个常量),但它不会替换someModule.callback 函数。替换函数使用someModule.callback = sinon.spy(someModule.callback)

【讨论】:

猜你喜欢
  • 2018-01-25
  • 1970-01-01
  • 2017-04-02
  • 1970-01-01
  • 1970-01-01
  • 2017-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多