如何用Jest模拟解构导入?解决模块找不到错误
解决Jest模拟解构导入时的模块找不到问题
嘿,我来帮你搞定这个Jest模拟的小坑!你遇到的Cannot find module 'utils' from 'Component.spec.js'错误本质是模块路径不匹配:你的组件里导入的是utils/paymentUtils,但测试代码里jest.mock('utils')写的是上级路径,Jest找不到这个模块,自然就报错了。
下面是完整的修正方案:
步骤1:修正jest.mock的模块路径
把jest.mock('utils')改成和组件导入完全一致的路径jest.mock('utils/paymentUtils'),让Jest能正确定位到要模拟的模块。
步骤2:正确模拟命名导出的方法
你已经用import * as utils from 'utils/paymentUtils'导入了整个模块,接下来可以直接给getSomething方法添加模拟实现。为了测试稳定性,建议把初始化逻辑放在beforeEach里:
import React from 'react'; import { shallow } from 'enzyme'; import Component from 'components/Component'; import * as utils from 'utils/paymentUtils'; // 修正路径,与组件导入路径完全一致 jest.mock('utils/paymentUtils'); describe('Component', () => { let wrapper; beforeEach(() => { // 重置mock,避免测试用例间状态污染 utils.getSomething.mockReset(); // 设置模拟返回值 utils.getSomething.mockImplementation(() => 'Blah'); // 渲染组件 wrapper = shallow(<Component />); }); it('should utilize the mocked getSomething value', () => { // 这里可以添加断言,比如验证方法被调用或组件正确使用了返回值 expect(utils.getSomething).toHaveBeenCalled(); }); });
可选:用工厂函数直接定义mock
如果你想更简洁,也可以在jest.mock里直接用工厂函数定义mock实现,省去单独调用mockImplementation的步骤:
jest.mock('utils/paymentUtils', () => ({ getSomething: jest.fn(() => 'Blah') }));
关键注意点
- 永远确保
jest.mock的路径和组件中import的路径完全一致,包括相对/绝对路径的写法 - 对于命名导出的模块,用
import * as module from 'path'的方式导入整个模块,能方便地访问所有导出方法并进行mock - 记得在测试用例前重置mock,避免不同测试用例之间的状态污染
内容的提问来源于stack exchange,提问作者Evanss
相关产品推荐
相关产品推荐

