如何测试Promise是否已被拒绝(无需关注拒绝原因)
如何仅测试Promise是否被拒绝(不关心拒绝原因)
好问题!如果只需要验证Promise是否进入拒绝状态、不需要纠结具体的拒绝原因的话,有几种简洁且规范的写法,我给你整理一下:
方法1:使用rejects.toBeDefined()(Jest)
这种写法直接断言Promise的拒绝状态,只要Promise被拒绝,不管返回什么错误值,都会通过测试:
it('should reject if no startdate is given', () => { expect.assertions(1); // 确保异步断言被执行,避免漏测 return expect(MyService.fetch()).rejects.toBeDefined(); });
方法2:使用rejects.toThrow()(语义化更强)
如果你的Promise拒绝时抛出的是Error对象,用toThrow()会更贴合语义,它不关心错误的具体内容,只要有错误抛出就通过:
it('should reject if no startdate is given', async () => { expect.assertions(1); await expect(MyService.fetch()).rejects.toThrow(); });
这里用了async/await写法,和返回Promise的效果是一样的,选你习惯的风格就行。
方法3:try-catch 手动捕获(更灵活)
如果你需要在捕获拒绝后做额外操作,也可以用try-catch的方式:
it('should reject if no startdate is given', async () => { expect.assertions(1); try { await MyService.fetch(); // 如果Promise没被拒绝,走到这里就触发断言失败 expect(true).toBe(false); } catch (err) { // 进入catch说明Promise被拒绝,断言通过 expect(true).toBe(true); } });
重要提示:expect.assertions(1)的作用
别忘了加上这句!它会确保测试中至少有1个断言被执行,避免因为Promise没进入预期状态(比如意外resolve了)而导致测试“假通过”的情况——毕竟异步测试如果没触发断言,Jest默认会认为测试通过,这会隐藏潜在问题。
内容的提问来源于stack exchange,提问作者user1283776
相关产品推荐
相关产品推荐

