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