如何测试React容器组件是否渲染所有子组件?测试问题排查
问题分析:NotificationContainer测试无法找到子组件
你编写的测试无法找到指定testid元素,核心有三个问题:
错误点1:Mock组件未返回JSX
你的MockNotificationContainer是箭头函数,但没有返回JSX内容,导致渲染的是空节点。箭头函数用大括号包裹代码时,必须显式写return。
错误点2:原组件未消费Context
你的NotificationContainer直接通过props接收notifications,但测试里却用Context传递数据,原组件根本没读取Context的值,所以不会渲染任何子组件。
错误点3:组件导入方式错误
原组件是默认导出(export default NotificationContainer),但测试里用了命名导入{ NotificationContainer },这会导致导入的是undefined,渲染不出内容。
修正后的测试代码
针对以上问题,直接给NotificationContainer传递props即可,不需要Mock Context(除非你原本打算让组件从Context读取数据,那需要修改原组件):
import { render } from '@testing-library/react'; import { expect, it } from 'vitest'; import NotificationContainer from '../../../src/components/Notification'; // 改为默认导入 it('renders all the notifications from props', () => { const notifications = [ { id: 34345, message: 'this is a test', severity: 'success' }, { id: 45555, message: 'this is a test', severity: 'error' }, { id: 32235, message: 'this is a test', severity: 'info' } ]; // 直接给组件传props const { getAllByTestId } = render(<NotificationContainer notifications={notifications} />); const allNotifications = getAllByTestId('notify-test'); expect(allNotifications.length).toBe(3); });
如果原本打算让组件从Context读取数据
如果你原本的设计是NotificationContainer从Context获取notifications,那需要先修改原组件:
// 修改后的NotificationContainer import React, { useContext } from 'react'; import BasicNotification from './BasicNotification'; import { NotificationContext } from '../contexts/NotificationContext'; const NotificationContainer = () => { const { notificationsObject } = useContext(NotificationContext); const notifications = notificationsObject.state; return ( <> {notifications.map((notification) => ( <BasicNotification key={notification.id} id={notification.id} message={notification.message} severity={notification.severity} data-testid='notify-test' /> ))} </> ); }; export default NotificationContainer;
然后修正测试组件的返回问题:
// 修正后的MockNotificationContainer const MockNotificationContainer = ({ notifications }) => { // 加上return return ( <NotificationContext.Provider value={{ notificationsObject: { state: notifications } }}> <NotificationContainer /> </NotificationContext.Provider> ); };
同时确保测试里的组件导入是默认导入,这样测试就能正常找到3个通知组件了。
内容的提问来源于stack exchange,提问作者Russell_up
相关产品推荐
相关产品推荐

