如何在Sinon中存根匿名函数?

时间:2017-07-19 22:43:36

标签: javascript testing sinon

以下内容:

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'),但这不是我在此之后所做的事情。这个问题。

1 个答案:

答案 0 :(得分:3)

你不能让它像这样工作。对于存根,Sinon 需要一个“根对象”,因为它需要替换要在该根对象中存根的函数引用。 this中的REPL仅适用于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