问题描述
这个测试通过了;即 sinon 说存根实际上被称为:
const sinon = require('sinon')
async function underTest (s){
promise1 = new Promise((yes,no)=>yes())
promise2 = new Promise((yes,no)=>yes())
Promise.all([promise1,promise2]).then(s.yes).catch(s.no)
}
async function test(){
s = {yes: sinon.stub(),no:sinon.stub()}
await underTest(s)
sinon.assert.called(s.yes)
}
test().then(console.log('done'))
注意我没有从 Promise.all
返回承诺。
但是,以下测试将失败,并且 sinon 会说未调用存根:
const sinon = require('sinon')
async function underTest (s){
promise1 = new Promise((yes,no)=>no())
promise2 = new Promise((yes,no)=>no())
Promise.all([promise1,no:sinon.stub()}
await underTest(s)
sinon.assert.called(s.no)
}
test().then(console.log('done'))
如果我返回 Promise.all
,那么它就会通过,并且 sinon 会说 s.no
存根被调用:
const sinon = require('sinon')
async function underTest (s){
promise1 = new Promise((yes,no)=>no())
return Promise.all([promise1,no:sinon.stub()}
await underTest(s)
sinon.assert.called(s.no)
}
test().then(console.log('done'))
测试只有在我从 Promise.all
返回 promise 时才能通过是有道理的。如果我什么都不返回,async
函数将解析为 undefined
并且存根可能已被调用,也可能未被调用。
我的问题是,如果没有 return 语句,我会期望测试失败,即使是第一种情况,承诺解决。我本来希望 sinon 告诉我 s.yes
没有被调用。但是为什么会通过呢?为什么resolve和reject不一致?
解决方法
我运行你的代码。否。您的第一个代码/案例测试已完成,但结果未通过。
如果你在运行测试时也实现了 catch ,你就有更好的方式来了解它:
test()
.then(() => console.log('done'))
.catch((error) => console.log('Error:',error.message));
您不一致地使用异步等待。
如果您使用异步等待,您可以使用 try and catch 捕获错误。
例如:
async function underTest (s){
promise1 = new Promise((yes,no)=>yes())
promise2 = new Promise((yes,no)=>yes())
try {
await Promise.all([promise1,promise2]);
s.yes();
} catch {
s.no();
}
// This will return Promise<void>
}