【问题标题】:How can I stub an anonymous function in Sinon?如何在 Sinon 中存根匿名函数?
【发布时间】:2017-07-19 22:43:35
【问题描述】:

以下内容:

const sinon = require('sinon')

const a = () => { return 1 }
sinon.stub(a)

抛出TypeError: Attempted to wrap undefined property undefined as function

stub 在有对象的情况下有效,所以我尝试使用this。在 node.js REPL (v6.11) 中:

> const a = () => { return 1 }
undefined
> this.a
[Function: a]

但是,在我的 mocha 规范中,它失败了:

const a = () => { return 1 }                                        

console.log(a)
// => [Function: a]

console.log(this.a)
// => undefined

我错过了什么?我怎样才能做到这一点?

顺便说一句:我知道我可以stub 一个对象的方法,就像这样:const stub = sinon.stub(object, 'a'),但这不是我在这里提出这个问题的目的。

【问题讨论】:

  • 不是真正的重复。这与 setter/getter 无关。
  • 你不能让它像这样工作。对于存根,Sinon 需要一个“根对象”,因为它需要替换您要在该根对象中存根的函数引用。 REPL 中的this 仅适用于 REPL 的实现方式。
  • @robertklep 显然你是对的。把这个写成答案,我会接受的。
  • @PawełGościcki 发布的答案基本上是一样的:)

标签: javascript testing sinon


【解决方案1】:

你不能让它像这样工作。对于存根,Sinon 需要一个“根对象”,因为它需要替换您要在该根对象中存根的函数引用。 REPL 中的 this 仅适用于 REPL 的实现方式。在最新的节点(v8)中,它不再像描述的那样自动将函数绑定到this

sinon.stub 接受一个对象,然后您可以存根属性。所以你应该可以做到

const obj = {
  a: (() => return 1; })
};

然后就可以打电话了

const stub = sinon.stub(obj, "a");

如您所见,您在示例中将const a 设置为一个函数——它必须是一个对象,然后sinon 可以存根该对象中的特定属性。我相信这样做的原因是它给了它一些 sinon 可以参考的东西,因此为什么 sinon 也可以支持像 object.method.restore() 这样的东西。

另一种解决方法是自行绑定到this(尽管不建议这样做):

const a = () => { return 1 }
this.a = a;

sinon.stub(this, 'a').returns(2);
console.log(this.a());
// => 2

【讨论】:

  • 是的,我知道您可以存根对象的方法。但我想了解为什么我不能在没有对象的情况下做到这一点,因为这在早期版本的 Sinon 中是有效的。
  • @PawełGościcki sinon.stub(fn) 在旧版本的 Sinon 中也不起作用。你的意思是sinon.spy(fn)
  • @PawełGościcki 那是 Python,不过 :D
  • 哈哈。确实!也许我的记忆力下降了。
  • 非常感谢您更新我的答案@PawełGościcki!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-08
  • 2015-02-12
  • 2021-10-21
  • 1970-01-01
  • 1970-01-01
  • 2020-03-29
  • 1970-01-01
相关资源
最近更新 更多