Javascript 意外的Sinon.js行为

Javascript 意外的Sinon.js行为,javascript,node.js,sinon,Javascript,Node.js,Sinon,我正在尝试使用和存根模块进行单元测试 我需要这样的条纹: const stripe = require('stripe'); const stubbedStripeClient = stripe.Stripe('test'); 在我的测试的根目录中(在我的顶层descripe()),我有以下内容: before('stub root', () => { sinon.stub(stripe, 'Stripe').returns(stubbedStripeClient); }); 然后

我正在尝试使用和存根模块进行单元测试

我需要这样的条纹:

const stripe = require('stripe');
const stubbedStripeClient = stripe.Stripe('test');
在我的测试的根目录中(在我的顶层
descripe()
),我有以下内容:

before('stub root', () => {
  sinon.stub(stripe, 'Stripe').returns(stubbedStripeClient);
});
然后,在
descripe()
块中,我实际上要调用一个Stripe方法,我有一个
before()
hook:

let stub;
before('stub', () => {
  console.log(typeof stubbedStripeClient.customers.create);
  stub = sinon.stub(stubbedStripeClient.customers, 'create', ({id: 'a-stripe-customer-id'}));
});
这就是我不明白会发生什么的地方。钩子(
console.log
)中的第一行输出:

作用

第二行引发此异常:

TypeError:尝试将未定义的属性包装为函数创建

这怎么可能?它怎么可能是一行上的函数而在下一行上是未定义的


我查看了Sinon.js源代码,并执行了此检查。如果我然后查看它们的函数,它将执行与我的
console.log
中的相同检查。我很困惑。

这是一条不幸的错误信息,具有误导性

存根调用的第三个参数不是函数,而是对象。从这个意义上讲,它需要是一个函数

要解决此问题,请更改:

({id: 'a-stripe-customer-id'})
例如:

() => { return {id: 'a-stripe-customer-id'}; }
…如果要返回该对象,或者可能是将该对象作为参数返回:

({id: 'a-stripe-customer-id'}) => {}

一个线索是,存根调用的第三个参数不是一个函数,而是一个对象。它需要一个函数。哦,哇。我真的希望这不是解决办法,但它现在确实起作用了。。。我真的需要对它进行外部检查,我只是忘记了声明函数的
()=>
,所以,正如您所说,我将传递一个普通对象作为第三个参数。但是,错误信息不是很清楚:/Thank a lot@WillYes这就是问题所在。第三个参数应该是返回
{id:'a-stripe-customer-id'}
对象的函数。我只是忘记了它前面的
()=>
。但是在我的例子中,
.returns()
比第三个参数更合适,并且不会导致此错误