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