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

使用Jest仅为单个测试用例mock React组件时报错如何修复

报错原因

你调用jest.requireActual('./Test')返回的是整个模块的导出对象,由于Test组件是用export default导出的,真实组件实际挂载在返回对象的.default属性上,你直接把整个模块对象传给mockImplementation,而它需要接收可执行的函数作为入参,自然会抛出specificMockImpl.apply is not a function的错误。

修复方案

仅修改beforeEach里的mockImplementation入参,取到真实组件的default导出即可,修复后的测试文件代码如下:

import { render } from '@testing-library/react';
import App from './App';
import Test from './Test';

jest.mock('./Test');

beforeEach(() => {
  // 取default属性拿到真实的组件函数
  Test.mockImplementation(jest.requireActual('./Test').default)
})

test('should render test component', () => {
  const { getByText} = render(<App />);
  expect(getByText('Test')).toBeInTheDocument()
})

test('should render with mocked test component', () => {
  Test.mockImplementation(() => <div>TEST VALUE</div>)
  const { getByText} = render(<App />);
  expect(getByText('TEST VALUE')).toBeInTheDocument()
})

补充说明

  • 如果你用的是ES模块命名导出而非默认导出,不需要加.default,直接取对应导出的属性名即可
  • 该写法可以保证每次测试前都重置为真实组件实现,仅在需要mock的测试用例里单独覆写实现,完全符合你的需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 11:21:04