如何使用Jest仅Mock Axios特定路由,保留其他路由正常功能
解决Jest中仅Mock特定Axios请求的问题
你当前的问题在于,jest.mock('axios')会把整个axios库的方法都替换成mock函数,而你的mockImplementation只处理了/route2的请求,其他请求(比如/route1)没有返回逻辑,所以自然会返回undefined。要实现仅Mock /route2,让/route1保持正常调用,我们需要让非目标请求走axios的原始实现。
具体解决方案
我们可以通过jest.requireActual获取未被Mock的真实axios模块,然后在mock逻辑中区分请求路径:
const axios = require('axios'); // 获取真实的axios模块,避免所有请求都被Mock const originalAxios = jest.requireActual('axios'); jest.mock('axios'); it(`gets data`, async () => { axios.post.mockImplementation(async (url, data) => { // 仅对/route2返回Mock响应 if (url.includes(`/route2`)) { return Promise.resolve({ data: { message: 'ok' } }); } else { // 其他请求(比如/route1)走原始的axios post实现 return originalAxios.post(url, data); } }); const res = await axios.post(`/route1`, dataQuery); expect(res).toBeTruthy(); });
代码解释
jest.requireActual('axios'):拿到未被jest Mock的真实axios实例,这样我们就能复用它的post方法处理不需要Mock的请求。- 条件判断逻辑:在mock实现中,我们检查请求URL是否包含
/route2,如果是则返回预设的Mock响应;否则调用原始的post方法,确保/route1的请求能正常发送,而它内部调用的/route2会被我们的Mock拦截并返回预设数据。
这种方式既实现了特定请求的Mock,又保留了其他请求的正常功能,非常适合你这种嵌套请求的测试场景。
内容的提问来源于stack exchange,提问作者Nikhil
相关产品推荐
相关产品推荐

