意外的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'}) => {}