如何解决为什么嘲笑的开玩笑诺言不会被allSettled拒绝?
我想测试一种方法,该方法返回Promise.allSettled()
的结果并调用另一个函数返回promise。
我将问题简化为以下测试代码:
describe('Promise tests',() => {
it('should reject directly',async () => {
const f = jest.fn().mockRejectedValue(new Error('foo'));
const p = async () => await f();
// works
await expect(p).rejects.toThrow('foo');
});
it('should reject with allSettled',async () => {
const f = jest.fn().mockRejectedValue(new Error('foo'));
const p = async () => await f();
const results = await Promise.allSettled([p]);
expect(results[0].status).toBe('rejected'); // fulfilled - but why?
expect(results[0].reason).toBe('foo');
});
});
为什么第二种情况没有收到被拒绝的承诺?
- node.js v14.3.0
- jest v25.4.0
解决方法
您快到了。 Promise.allSettled
希望收到一个Promises数组,而不是返回一个Promise的函数数组,这实际上是常量p
所做的。
只需致电p()
即可解决问题:
describe('Promise tests',() => {
it('should reject directly',async () => {
const f = jest.fn().mockRejectedValue(new Error('foo'));
const p = async () => await f();
// works
await expect(p()).rejects.toThrow('foo');
});
it('should reject with allSettled',async () => {
const f = jest.fn().mockRejectedValue(new Error('foo'));
const p = async () => await f();
const results = await Promise.allSettled([p()]);
expect(results[0].status).toBe('rejected'); // fulfilled - but why?
expect(results[0].reason).toBe('foo');
});
});
顺便:我的小子抱怨不必要的等待:-)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。