如何在Jest的单条测试用例中禁用指定的Axios Mock模拟
问题根因
你遇到的问题本质是Jest的模块缓存机制导致的:如果你的业务代码(包含getLatestPrice的模块)在测试文件顶部就完成了导入,此时axios已经被替换为mock版本并缓存,你在测试用例内部调用jest.unmock或者修改mock对象属性,都不会影响已经导入的业务代码持有的axios引用。
方案1:按测试用例动态导入依赖(完全禁用mock)
通过jest.resetModules清空模块缓存,按用例粒度控制依赖导入,确保需要真实axios的用例导入时已经关闭mock:
describe(`getLatestPrice`, () => { // 每次执行用例前清空所有模块缓存,避免用例间互相影响 beforeEach(() => { jest.resetModules(); }); it(`throws an error when the response is bad`, async () => { // 未关闭mock,导入的业务代码依赖mock版axios const { getLatestPrice } = require('./你的业务模块路径'); // 补充:异步函数抛出错误需要用rejects断言 await expect(getLatestPrice(assetCode)).rejects.toThrow(); }); it(`gets a single price by stream code`, async () => { // 先关闭axios mock jest.unmock("axios"); // 再导入业务代码,此时依赖的是真实axios const { getLatestPrice } = require('./你的业务模块路径'); const price = await getLatestPrice(assetCode); expect(price).toEqual({ // 你的预期返回值 }); }); })
方案2:修改mock函数实现(局部替换mock逻辑)
如果不想修改导入逻辑,可以把mock的create方法改为Jest mock函数,单条用例临时替换为真实实现:
- 先修改
__mocks__/axios.js的create为mock函数:
// __mocks__/axios.js const axios = jest.createMockFromModule("axios"); const log = console.log.bind(console); // 改为jest mock函数,支持动态修改实现 axios.create = jest.fn(() => { log(`Running axios.create`); return { get: jest.fn(() => Promise.resolve({ status: 500, statusText: "Internal Server Error", body: { onFire: "Mock API response from mock axios module", }, })), }; }); module.exports = axios;
- 测试用例中临时替换
create的实现:
// 顶部提前导入依赖即可 const { getLatestPrice } = require('./你的业务模块路径'); const mockAxios = require('axios'); const actualAxios = jest.requireActual('axios'); describe(`getLatestPrice`, () => { // 每个用例执行后恢复mock的原始实现 afterEach(() => { mockAxios.create.mockRestore(); }); it(`throws an error when the response is bad`, async () => { await expect(getLatestPrice(assetCode)).rejects.toThrow(); }); it(`gets a single price by stream code`, async () => { // 临时替换为真实axios的create实现 mockAxios.create.mockImplementation(actualAxios.create); const price = await getLatestPrice(assetCode); expect(price).toEqual({ // 你的预期返回值 }); }); })
内容的提问来源于stack exchange,提问作者mikemaccana
相关产品推荐
相关产品推荐

