意外的Sinon.js行为

我试图用Mocha和Sinon.js来存储unit testing的Stripe模块。

我需要像这样的条纹:

const stripe = require('stripe'); const stubbedStripeClient = stripe.Stripe('test'); 

在我的testing的根源(在我的顶级describe() )我有这样的:

 before('stub root', () => { sinon.stub(stripe, 'Stripe').returns(stubbedStripeClient); }); 

然后,在我实际上会调用Stripe方法的describe()块中,我有这个before()钩子:

 let stub; before('stub', () => { console.log(typeof stubbedStripeClient.customers.create); stub = sinon.stub(stubbedStripeClient.customers, 'create', ({id: 'a-stripe-customer-id'})); }); 

这是我不明白发生了什么。 钩子的第一行( console.log )输出:

function

第二行引发这个exception:

TypeError:尝试包装未定义的属性create as function

这怎么可能? 它怎么可能是一个线上的function,并在下一行未定义?

我看了一下Sinon.js的源码,这个检查在这里执行。 如果我然后看看他们的isFunction函数,它执行我在我的console.log相同的检查。 我感到困惑。

这是一个不幸的和误导性的错误信息。

存根调用的第三个参数不是一个函数,而是一个对象。 从文档它需要是一个function。

要解决,请更改:

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

像这样的东西:

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

…如果你想返回该对象,或者你的意思是作为参数的对象:

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