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()
比第三个参数更合适,并且不会导致此错误