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

如何在被测React组件中Mock工具函数?附场景代码

我来帮你搞定这个Mock的问题!你的核心问题在于,你试图通过props传递mock函数,但你的Square组件根本不是通过props接收这些工具函数的——它是直接从utils模块导入使用的。所以得用Jest的模块Mock功能来替换这些导入的函数,具体步骤如下:

第一步:用Jest Mock工具模块

在你的组件测试文件顶部,添加jest.mock来mock对应的utils模块,这样组件导入的就是我们的mock函数了:

// 在测试文件最顶部
import React from 'react';
import { shallow } from 'enzyme';
import { testCommonComponentAttrs } from '../../utils/tests';
import Square from './square';
import { calculateBalance } from 'utils/math';
import { setStyle } from 'utils/modifiers';

// Mock 两个工具函数所在的模块
jest.mock('utils/math', () => ({
  calculateBalance: jest.fn()
}));

jest.mock('utils/modifiers', () => ({
  setStyle: jest.fn()
}));

const coin = { id: 'bitcoin', symbol: 'BTC', price_usd: '0', balance: '0' };

第二步:调整测试逻辑,移除无效的props传递

你的Square组件并没有接收setStyle和calculateBalance作为props,所以之前把它们传到testCommonComponentAttrs里是没用的,改成只传coin即可:

describe('<Square /> component', () => {
  // 每次测试前重置mock函数,避免测试间互相影响
  beforeEach(() => {
    calculateBalance.mockReset();
    setStyle.mockReset();
    // 可以给mock函数设置默认返回值,确保组件渲染正常
    setStyle.mockReturnValue({});
    calculateBalance.mockReturnValue(0);
  });

  // 只传递组件需要的coin props
  testCommonComponentAttrs(Square, { coin });

  // 额外测试:验证工具函数是否被正确调用
  it('calls setStyle with the coin id when rendering', () => {
    shallow(<Square coin={coin} />);
    expect(setStyle).toHaveBeenCalledWith(coin.id);
  });

  it('calls calculateBalance with the coin object', () => {
    shallow(<Square coin={coin} />);
    expect(calculateBalance).toHaveBeenCalledWith(coin);
  });
});

为什么之前的方式不行?

你的Square组件代码里是直接导入工具函数使用的:

import { calculateBalance } from 'utils/math';
import { setStyle } from 'utils/modifiers';

它并没有从props里获取这两个函数,所以你通过props传入的mock函数完全没被组件用到——组件还是在用原始的工具函数(或者未被mock的版本),这就导致了测试报错。

一些额外提示

  • 记得在beforeEach里重置mock函数,防止不同测试用例之间的状态污染。
  • 如果需要测试不同返回值的情况,可以在单个测试用例里覆盖mock的返回值,比如:
    it('displays the correct calculated balance', () => {
      calculateBalance.mockReturnValue(100);
      const wrapper = shallow(<Square coin={coin} />);
      expect(wrapper.find('.f18').text()).toContain('$100');
    });
    

内容的提问来源于stack exchange,提问作者Leon Gaban

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:18:47