我尝试使用Stripe和Mocha来存储Sinon.js模块进行单元测试。
我需要Stripe这样:
const stripe = require('stripe');
const stubbedStripeClient = stripe.Stripe('test');
在我的测试的根源(在我的顶级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
)输出:
功能
第二行抛出此异常:
TypeError:尝试将未定义的属性包装为函数
这怎么可能?它如何成为一行上的函数并在下一行中未定义?
我查看了Sinon.js源代码,并执行了此检查here。如果我查看他们的isFunction
函数,它会执行我console.log
中的相同检查。我很困惑。
答案 0 :(得分:1)
这是一个令人遗憾和误导性的错误信息。
存根调用的第三个参数不是函数而是对象。从the docs起,它需要是一个功能。
要解决,请更改:
({id: 'a-stripe-customer-id'})
类似于:
() => { return {id: 'a-stripe-customer-id'}; }
...如果您想要返回该对象,或者您可能将该对象视为参数:
({id: 'a-stripe-customer-id'}) => {}