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

使用Jest测试react-native-ui-datepicker时出现类型错误如何解决?

问题描述

我在使用react-native-ui-datepicker库的DateTimePicker组件时,用Jest编写测试用例出现以下错误:

Warning: React.jsx: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: object.

Check the render method of `SingleDatePicker`.
    at onChange (/Users/**/DateTimePicker/SingleDatePicker.tsx:9:3)

18 |       testID="single-date-picker"
19 |     >
> 20 |       <DateTimePicker
     |       ^
21 |         mode={'single'}
22 |         date={date}
23 |         onChange={onChange}

at printWarning (node_modules/react/cjs/react-jsx-runtime.development.js:87:30)
at error (node_modules/react/cjs/react-jsx-runtime.development.js:61:7)

我的测试用例代码如下:

import React from 'react';
import dayjs from 'dayjs';
import { render } from '@testing-library/react-native';
import DatePicker from './DatePicker';
import { screen } from '@testing-library/react-native';

jest.mock('react-native-ui-datepicker', () => ({
  default: jest.fn(),
}));

const mockOnChange = jest.fn();

describe('Testing DatePicker', () => {
  const date = dayjs().format();
  it('Testing DatePicker', () => {
    render(
      <DatePicker type="single" date={date} onChange={mockOnChange} />
    );
    expect(screen.queryByTestId('single-date-picker')).toBeTruthy();
  });
});

请问如何解决这个错误?


解决方案

错误原因是你在jest.mock中把react-native-ui-datepicker的默认导出设为jest.fn(),但React渲染组件要求传入的是可渲染的函数/类组件,而非普通函数对象。

方法1:模拟可渲染的占位组件

将mock改为返回一个能正常渲染的函数组件,React Native环境下用View作为容器:

import { View } from 'react-native';

jest.mock('react-native-ui-datepicker', () => ({
  default: (props) => <View testID="mock-date-picker" {...props} />,
}));

方法2:适配命名导入场景

如果你的业务组件中是通过命名导入DateTimePicker(如下):

import { DateTimePicker } from 'react-native-ui-datepicker';

则需要修改mock,对应导出DateTimePicker命名组件:

import { View } from 'react-native';

jest.mock('react-native-ui-datepicker', () => ({
  DateTimePicker: (props) => <View testID="mock-date-picker" {...props} />,
}));

验证修改效果

重新运行测试,错误即可消失。还可以添加断言验证mock组件是否正常渲染:

expect(screen.queryByTestId('mock-date-picker')).toBeTruthy();

内容的提问来源于stack exchange,提问作者Kavin Raju S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 23:43:24