| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160 |
- import { describe, it, expect, vi, beforeEach } from 'vitest';
- import { render, screen, fireEvent, waitFor } from '@testing-library/react';
- import { QueryClient, QueryClientProvider } from '@tanstack/react-query';
- import { FormProvider, useForm } from 'react-hook-form';
- import { AreaSelect } from '../../src/components/AreaSelect';
- // Mock API客户端
- vi.mock('../../src/api/areaClient', () => ({
- areaClientManager: {
- get: vi.fn(() => ({
- index: {
- $get: vi.fn(() => Promise.resolve({
- status: 200,
- json: () => Promise.resolve({
- data: [
- { id: 1, name: '北京市', level: 1 },
- { id: 2, name: '上海市', level: 1 }
- ]
- })
- }))
- }
- }))
- }
- }));
- // 测试组件包装器
- const TestWrapper = ({ children }: { children: React.ReactNode }) => {
- const queryClient = new QueryClient({
- defaultOptions: {
- queries: {
- retry: false,
- },
- },
- });
- // 创建一个简单的form context
- const methods = useForm();
- return (
- <QueryClientProvider client={queryClient}>
- <FormProvider {...methods}>
- {children}
- </FormProvider>
- </QueryClientProvider>
- );
- };
- describe('AreaSelect 组件测试', () => {
- beforeEach(() => {
- vi.clearAllMocks();
- });
- it('应该正确渲染AreaSelect组件', () => {
- render(
- <TestWrapper>
- <AreaSelect />
- </TestWrapper>
- );
- expect(screen.getByText('选择所在省份')).toBeInTheDocument();
- expect(screen.getByText('选择所在城市')).toBeInTheDocument();
- expect(screen.getByText('选择所在区县')).toBeInTheDocument();
- });
- it('当required=true时,省份应该显示必填标记,城市和区县不应该显示必填标记(未选择省份时)', () => {
- render(
- <TestWrapper>
- <AreaSelect required={true} />
- </TestWrapper>
- );
- // 检查省份标签是否包含星号
- const provinceLabel = screen.getByText('省份');
- expect(provinceLabel.innerHTML).toContain('*');
- // 检查城市标签不应该包含星号(因为还没有选择省份)
- const cityLabel = screen.getByText('城市');
- expect(cityLabel.innerHTML).not.toContain('*');
- // 检查区县标签不应该包含星号
- const districtLabel = screen.getByText('区县');
- expect(districtLabel.innerHTML).not.toContain('*');
- });
- it('当required=false时,所有字段都不应该显示必填标记', () => {
- render(
- <TestWrapper>
- <AreaSelect required={false} />
- </TestWrapper>
- );
- const provinceLabel = screen.getByText('省份');
- expect(provinceLabel.innerHTML).not.toContain('*');
- const cityLabel = screen.getByText('城市');
- expect(cityLabel.innerHTML).not.toContain('*');
- const districtLabel = screen.getByText('区县');
- expect(districtLabel.innerHTML).not.toContain('*');
- });
- it('当选择了城市时,区县字段不应该显示必填标记(即使required=true)', () => {
- // 这个测试验证区县字段永远不会显示必填标记
- // 即使required=true且选择了城市,区县字段也不应该显示星号
- render(
- <TestWrapper>
- <AreaSelect required={true} />
- </TestWrapper>
- );
- // 检查区县标签不应该包含星号
- const districtLabel = screen.getByText('区县');
- expect(districtLabel.innerHTML).not.toContain('*');
- });
- it('应该正确处理onChange回调', () => {
- const handleChange = vi.fn();
- render(
- <TestWrapper>
- <AreaSelect onChange={handleChange} />
- </TestWrapper>
- );
- // 验证组件渲染正常
- expect(screen.getByText('选择所在省份')).toBeInTheDocument();
- // onChange会在用户交互时被调用,这里我们只验证组件能接收onChange prop
- expect(handleChange).not.toHaveBeenCalled();
- });
- it('应该支持禁用状态', () => {
- render(
- <TestWrapper>
- <AreaSelect disabled={true} />
- </TestWrapper>
- );
- // 验证组件渲染正常
- expect(screen.getByText('选择所在省份')).toBeInTheDocument();
- // 禁用状态会在UI中体现,这里我们只验证组件能接收disabled prop
- });
- it('应该正确处理初始值', () => {
- const initialValue = {
- provinceId: 1,
- cityId: 3,
- districtId: 5
- };
- render(
- <TestWrapper>
- <AreaSelect value={initialValue} />
- </TestWrapper>
- );
- // 验证组件渲染正常 - 查找FormDescription中的文本
- expect(screen.getByText('选择所在省份')).toBeInTheDocument();
- // 初始值会在组件内部处理,这里我们只验证组件能接收value prop
- });
- });
|