意外的Sinon.js行为

时间:2017-05-11 20:40:14

标签: javascript node.js sinon

我尝试使用StripeMocha来存储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中的相同检查。我很困惑。

1 个答案:

答案 0 :(得分:1)

这是一个令人遗憾和误导性的错误信息。

存根调用的第三个参数不是函数而是对象。从the docs起,它需要是一个功能。

要解决,请更改:

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

类似于:

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

...如果您想要返回该对象,或者您可能将该对象视为参数:

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