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

React Jest测试报错:Cannot read properties of undefined (reading 'init')求助

解决Jest测试中TypeError: Cannot read properties of undefined (reading 'init')的问题

这个错误表明你的Project或Sample组件中,正在尝试调用某个未定义对象的init方法。以下是几种针对性的解决思路:

1. 模拟全局SDK对象

如果错误来自全局环境中的对象(比如window.someSDK.init()),在测试中手动模拟该对象:

在测试文件的describe块内添加:

beforeEach(() => {
  // 替换成实际的SDK名称
  window.someSDK = {
    init: jest.fn()
  };
});

afterEach(() => {
  delete window.someSDK;
});

2. 模拟第三方模块

如果组件导入了某个包含init方法的模块,用Jest mock该模块:

在测试文件顶部添加:

// 替换成实际的模块名
jest.mock('some-sdk', () => ({
  init: jest.fn()
}));

3. 检查ProviderProps是否缺失必要属性

确认传递给Project组件的providerProps包含所有必需的属性。如果组件期望某个带有init方法的对象作为prop,但你没有在providerProps中定义,就会触发这个错误。

4. 检查renderWrapper的配置

renderWrapper可能负责设置上下文或全局依赖。确认它是否正确模拟了组件所需的所有环境,比如是否遗漏了某个Provider或全局对象的初始化。

调整后的测试示例(假设是全局SDK的情况):

import React from 'react';
import { fireEvent, logRoles, screen } from '@testing-library/react';
import { renderWrapper } from '../../__utils__';

describe('TestingTab', () => {
  beforeEach(() => {
    // 模拟全局SDK的init方法
    window.someSDK = { init: jest.fn() };
  });

  afterEach(() => {
    delete window.someSDK;
  });

  it('renders Tab correctly', () => {
    const closeSpy = jest.spyOn(window, 'close').mockImplementation(() => {});
    const providerProps = {
      setCurrentStep: jest.fn(),
      eligibleData: [{
        Name: 'ABC',
        Role: 'XYZ',
        balance: 3694.9,
        Age: 18,
        paymentDue: 1000,
        isChecked: false,
        isEligible: false,
      }],
      setAccount: jest.fn(),
      continueNext: 'no',
      setNextTerms: jest.fn(),
      currentStep: 1,
      wizard: {
        next: jest.fn(() => true),
        previous: jest.fn(),
      },
    };
    
    renderWrapper(
      <Project {...providerProps}>
        <Sample />
      </Project>
    );

    logRoles(screen.getByRole('tabpanel')); // 可选,调整为实际的容器角色
    const checkBoxElement = screen.getByRole('checkbox');
    expect(checkBoxElement).toBeDisabled();
    
    const closeButton = screen.getByRole('button', { name: /close/i }); // 更精确地定位按钮
    expect(closeButton).toBeInTheDocument();
    
    fireEvent.click(closeButton);
    expect(closeSpy).toHaveBeenCalledTimes(1);

    closeSpy.mockRestore();
  });
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 13:27:47