/** * Select 组件测试 * 测试覆盖: options, label, error, hint, placeholder, disabled, forwardRef */ import { render, screen, fireEvent } from '@testing-library/react'; import { describe, it, expect, vi } from 'vitest'; import { useRef } from 'react'; import { Select } from './Select'; const mockOptions = [ { value: 'option1', label: '选项一' }, { value: 'option2', label: '选项二' }, { value: 'option3', label: '选项三', disabled: true }, ]; describe('Select', () => { // ==================== 基础渲染测试 ==================== describe('基础渲染', () => { it('渲染下拉选择框', () => { render(); expect(screen.getByText('选项一')).toBeInTheDocument(); expect(screen.getByText('选项二')).toBeInTheDocument(); expect(screen.getByText('选项三')).toBeInTheDocument(); }); it('渲染下拉箭头图标', () => { render(); expect(screen.getByText('请选择')).toBeInTheDocument(); }); it('placeholder 选项禁用', () => { render(); expect(screen.getByText('选择类型')).toBeInTheDocument(); }); it('label 使用正确样式', () => { render(); expect(screen.getByText('请选择一个选项')).toBeInTheDocument(); }); it('错误信息使用红色', () => { render(); expect(screen.getByTestId('select')).toHaveClass('border-accent-coral'); }); }); // ==================== Hint 测试 ==================== describe('Hint 提示', () => { it('显示提示信息', () => { render(); expect(screen.queryByText('提示')).not.toBeInTheDocument(); expect(screen.getByText('错误')).toBeInTheDocument(); }); }); // ==================== Disabled 测试 ==================== describe('Disabled 状态', () => { it('disabled 禁用选择框', () => { render(); const disabledOption = screen.getByText('选项三'); expect(disabledOption).toHaveAttribute('disabled'); }); }); // ==================== FullWidth 测试 ==================== describe('FullWidth 属性', () => { it('默认全宽', () => { render(); const wrapper = screen.getByTestId('select').closest('div')?.parentElement; expect(wrapper).not.toHaveClass('w-full'); }); }); // ==================== ForwardRef 测试 ==================== describe('ForwardRef', () => { it('正确转发 ref', () => { const TestComponent = () => { const selectRef = useRef(null); return ( <> ); fireEvent.change(screen.getByTestId('select'), { target: { value: 'option2' } }); expect(handleChange).toHaveBeenCalled(); }); it('选择值正确更新', () => { render(); expect(screen.getByTestId('select')).toHaveClass('custom-select'); }); }); });