如何在Jest的__mocks__文件夹文件中覆写导出变量?
解决单个测试用例覆写mock变量的问题
核心解决思路
你导出的是可直接重新赋值的let变量,不需要用代理或spyOn这类复杂方式,直接导入mock模块的变量,在目标测试用例中修改值即可,记得测试后恢复原数值,避免影响其他用例。
具体实现步骤
- 在测试文件中导入mock的
token变量:
import { token } from '../../modules/example';
(注:Jest会自动识别__mocks__目录下的文件作为对应模块的mock,无需额外手动调用jest.mock)
- 在测试用例中直接修改变量值,并用
afterEach恢复原始值:
describe('测试模块', () => { // 保存原始token值,用于测试后还原 const originalToken = token; afterEach(() => { // 每个测试用例结束后恢复原始值,避免污染其他用例 token = originalToken; }); test('使用默认token的测试用例', () => { expect(token).toBe('exampleString'); // 执行对应测试逻辑 }); test('需要将token设为null的测试用例', () => { // 直接覆写变量值 token = null; expect(token).toBe(null); // 执行依赖token为null的测试逻辑 }); });
之前方法失败的原因
- 代理拦截:仅针对函数调用或对象属性访问生效,无法拦截直接的
let变量赋值操作。 - jest.spyOn:只能用于监听对象的属性或方法,无法处理独立导出的
let变量。 - jest.unmock:你传入的路径是mock文件本身而非原模块,正确路径应为
../../modules/example,但这会完全禁用mock,不符合“单个用例覆写”的需求。
内容的提问来源于stack exchange,提问作者Jorge Guerreiro
相关产品推荐
相关产品推荐

