import { beforeEach, describe, expect, it, vi } from 'vitest'; import { act, fireEvent, render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; import ToolCard from '@/pages/Dashboard/ToolCard'; import AccessTimeIcon from '@mui/icons-material/AccessTime'; describe('ToolCard 组件', () => { beforeEach(() => { vi.clearAllMocks(); }); describe('渲染测试', () => { it('应渲染标题和描述', () => { render( {}} />, ); expect(screen.getByText('测试工具')).toBeInTheDocument(); expect(screen.getByText('这是一个测试工具')).toBeInTheDocument(); }); it('无描述时仅渲染标题', () => { render( {}} />, ); expect(screen.getByText('仅标题')).toBeInTheDocument(); }); it('应渲染图标', () => { const { container } = render( {}} />, ); const svgElement = container.querySelector('svg'); expect(svgElement).toBeInTheDocument(); }); it('提供快照内容时应渲染快照', () => { render( {}} snapshot={
快照内容
} />, ); expect(screen.getByTestId('snapshot')).toBeInTheDocument(); }); it('未提供快照时不渲染快照区域', () => { const { container } = render( {}} />, ); expect(container.querySelector('[data-testid="snapshot"]')).not.toBeInTheDocument(); }); it('应使用 CardActionArea 渲染,支持键盘聚焦', () => { render( {}} />, ); const button = screen.getByRole('button', { name: /可聚焦/ }); expect(button).toBeInTheDocument(); expect(button).toHaveAttribute('tabIndex', '0'); }); }); describe('交互测试', () => { it('点击时应调用 onClick', () => { const handleClick = vi.fn(); render( , ); const button = screen.getByRole('button', { name: /可点击/ }); fireEvent.click(button); expect(handleClick).toHaveBeenCalledTimes(1); }); it('按 Enter 键时应调用 onClick', async () => { const handleClick = vi.fn(); render( , ); const button = screen.getByRole('button', { name: /键盘可触发/ }); await act(async () => { button.focus(); await userEvent.keyboard('{Enter}'); }); expect(handleClick).toHaveBeenCalledTimes(1); }); }); describe('样式测试', () => { it('应应用自定义颜色代码', () => { const { container } = render( {}} />, ); const svgElement = container.querySelector('svg'); expect(svgElement).toBeInTheDocument(); }); }); });