You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:45:00