如何在Jest中实现嵌套断言,或对拒绝的Promise做多验证?
优化被拒绝Promise的多项验证方案
方案一:捕获错误后逐一断言
先通过expect().rejects.toBeDefined()捕获被拒绝的错误对象,再对其做独立的多项验证,无需额外返回值,逻辑更清晰:
// 捕获被拒绝的Promise错误 const axiosError = await expect(axios.get('<some call that throws a 40x error>')).rejects.toBeDefined(); // 逐项验证错误属性 expect(axiosError.response?.status).toBe(400); expect(axiosError.response?.data).toHaveProperty('message'); expect(axiosError.response?.data.message).toMatch(/invalid period.*/);
方案二:使用toMatchObject做结构化匹配
利用Jest的toMatchObject匹配器,直接对错误对象的嵌套结构做验证,甚至可以在内部嵌套其他匹配器(比如expect.stringMatching),一次完成多项校验,代码更简洁:
await expect(axios.get('<some call that throws a 40x error>')).rejects.toMatchObject({ response: { status: 400, data: { message: expect.stringMatching(/invalid period.*/) } } });
为什么这两种方法更优
原来用toSatisfy的方式本质是“滥用”该匹配器——toSatisfy原本是用来验证单个布尔条件的,强行在内部塞多个断言不仅违反设计意图,还必须手动返回true,可读性和维护性都很差。上面两种方案要么拆分断言提升清晰度,要么用结构化匹配精简代码,都更符合Jest的最佳实践。
内容的提问来源于stack exchange,提问作者Michael Wiles
相关产品推荐
相关产品推荐

