如何解决为什么这个测试只有在被拒绝时才会失败?
这个测试通过了;即 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>
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。