本文讲解如何在 Jest 中正确模拟异步函数并防止测试间数据污染,重点解决因共享引用导致的 mockData.shift() 影响后续测试的问题。
本文讲解如何在 jest 中正确模拟异步函数并防止测试间数据污染,重点解决因共享引用导致的 `mockdata.shift()` 影响后续测试的问题。
在 Jest 单元测试中,若多个测试用例共用同一个数组(如 mockData)并对其执行 shift() 等原地修改操作,会导致后续测试读取到已被篡改的数据,从而引发不可预期的失败——正如问题中第二个测试返回 id: 2 而非预期的 id: 1。
根本原因在于:mockData 在 describe 块顶层声明,被所有 it 用例共享;而 data.shift() 直接修改了该数组的内部状态,破坏了测试隔离性。
应将 mockData 的初始化移至每个 it 块内,确保每次测试都获得一个全新、未被修改的数组实例:
it('Should return a id 1', async () => { const mockData = [{ id: 1 }, { id: 2 }, { id: 3 }]; // ✅ 每次新建 getData.mockResolvedValue(mockData); const response = await Helpers.execute(); expect(response.id).toBe(1);});it('Should return a id 1 with true flag', async () => { const mockData = [{ id: 1 }, { id: 2 }, { id: 3 }]; // ✅ 独立副本 getData.mockResolvedValue(mockData); track.mockResolvedValue({}); const response = await Helpers.execute(true); expect(response.id).toBe(1);});
| 项目 | 推荐做法 |
|---|---|
| Mock 数据生命周期 | 每个测试用例内声明,禁止跨用例复用可变对象 |
| 异步调用 | 所有 async 函数调用必须 await,避免 Promise 误用 |
| Mock 位置 | jest.mock() 放在文件顶部(module scope),保证模块加载前生效 |
| 清理机制 | 使用 afterEach(() => jest.clearAllMocks()) 保障测试间隔离 |
遵循以上原则,即可彻底杜绝因数据引用共享导致的测试污染问题,构建稳定、可维护的 Jest 测试套件。