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

React组件测试中useContext钩子报错问题求助

React组件测试中useContext依赖报错的解决办法

测试Search组件时抛出以下错误:

Error: Uncaught [TypeError: Cannot destructure property 'cityObj' of '_react.default.useContext(...)' as it is undefined.]

问题根源

Search组件本身不依赖CityContext,但它的子组件Select通过useContext(CityContext)获取上下文数据。单独渲染<Search />时,没有提供该上下文的Provider,导致useContext(CityContext)返回undefined,解构cityObj时触发类型错误。


解决方案

方案一:在测试中提供Context Provider

直接导入CityContext,用它的Provider包裹要测试的Search组件,传入符合结构的默认值:

import React from 'react'
import { render, fireEvent, waitFor, screen } from '@testing-library/react'
import '@testing-library/jest-dom'
import Search from './day8-weather2-search'
// 导入Main组件中定义的CityContext
import { CityContext } from './day8-weather1-main'

test('search tests', async () => {
  render(
    <CityContext.Provider value={{ 
      cityObj: 'Calgary', // 与Main组件初始值保持一致
      setCityObj: jest.fn() // 用jest mock函数替代真实的状态更新函数
    }}>
      <Search />
    </CityContext.Provider>
  )
  
  // 可在此添加具体测试逻辑,比如验证输入框、提交按钮行为
});

方案二:Mock子组件Select

如果测试仅聚焦Search组件的核心逻辑(比如输入、API请求),可以用jest.mock替换Select组件,隔离其上下文依赖:

import React from 'react'
import { render, fireEvent, waitFor, screen } from '@testing-library/react'
import '@testing-library/jest-dom'
import Search from './day8-weather2-search'

// Mock Select组件,返回一个简单的占位元素
jest.mock('./day8-weather3-select', () => () => <div data-testid="mocked-select"></div>)

test('search tests', async () => {
  render(<Search />)
  
  // 测试Search组件的输入逻辑
  const input = screen.getByTestId('subSearch')
  fireEvent.change(input, { target: { value: 'Toronto' } })
  expect(input).toHaveValue('Toronto')
});

方案选择建议

  • 方案一适合需要测试Search与Select完整交互的场景,保留组件树完整性。
  • 方案二更适合单独测试Search组件的核心功能,隔离子组件依赖,让测试更聚焦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 23:30:05