import React from 'react' import { render, fireEvent, waitFor } from '@testing-library/react' import { AreaCascader } from '../../src/components/AreaCascader' // Mock API调用 jest.mock('../../src/api', () => ({ areaClient: { provinces: { $get: jest.fn().mockResolvedValue({ status: 200, json: jest.fn().mockResolvedValue([ { id: 1, name: '北京市', level: 1 }, { id: 2, name: '上海市', level: 1 }, { id: 3, name: '广东省', level: 1 } ]) }) }, cities: { $get: jest.fn().mockImplementation(({ query }) => { if (query.provinceId === 1) { return Promise.resolve({ status: 200, json: jest.fn().mockResolvedValue([ { id: 11, name: '北京市', level: 2, parentId: 1 } ]) }) } if (query.provinceId === 3) { return Promise.resolve({ status: 200, json: jest.fn().mockResolvedValue([ { id: 31, name: '广州市', level: 2, parentId: 3 }, { id: 32, name: '深圳市', level: 2, parentId: 3 } ]) }) } return Promise.resolve({ status: 200, json: jest.fn().mockResolvedValue([]) }) }) }, districts: { $get: jest.fn().mockImplementation(({ query }) => { if (query.cityId === 11) { return Promise.resolve({ status: 200, json: jest.fn().mockResolvedValue([ { id: 111, name: '朝阳区', level: 3, parentId: 11 }, { id: 112, name: '海淀区', level: 3, parentId: 11 } ]) }) } return Promise.resolve({ status: 200, json: jest.fn().mockResolvedValue([]) }) }) } } })) describe('AreaCascader', () => { beforeEach(() => { jest.clearAllMocks() }) it('应该正确渲染初始状态', async () => { const { getByText } = render() await waitFor(() => { expect(getByText('请选择省份')).toBeTruthy() expect(getByText('请选择城市')).toBeTruthy() expect(getByText('请选择区县')).toBeTruthy() }) }) it('应该加载省份列表', async () => { const { getByText } = render() await waitFor(() => { expect(getByText('北京市')).toBeTruthy() expect(getByText('上海市')).toBeTruthy() expect(getByText('广东省')).toBeTruthy() }) }) it('应该在选择省份后加载城市列表', async () => { const { getByText } = render() await waitFor(() => { expect(getByText('北京市')).toBeTruthy() }) // 模拟选择北京市 const beijingPicker = getByText('北京市') fireEvent.click(beijingPicker) await waitFor(() => { expect(getByText('北京市')).toBeTruthy() // 城市列表中的北京市 }) }) it('应该在选择城市后加载区县列表', async () => { const { getByText } = render() await waitFor(() => { expect(getByText('北京市')).toBeTruthy() }) // 选择省份 const beijingProvince = getByText('北京市') fireEvent.click(beijingProvince) await waitFor(() => { expect(getByText('北京市')).toBeTruthy() // 城市 }) // 选择城市 const beijingCity = getByText('北京市') fireEvent.click(beijingCity) await waitFor(() => { expect(getByText('朝阳区')).toBeTruthy() expect(getByText('海淀区')).toBeTruthy() }) }) it('应该正确触发onChange回调', async () => { const mockOnChange = jest.fn() const { getByText } = render( ) await waitFor(() => { expect(getByText('北京市')).toBeTruthy() }) // 选择省份 const beijingProvince = getByText('北京市') fireEvent.click(beijingProvince) await waitFor(() => { expect(mockOnChange).toHaveBeenCalledWith([1]) }) }) it('应该正确显示已选择的值', async () => { const { getByText } = render( ) await waitFor(() => { expect(getByText('北京市 北京市 朝阳区')).toBeTruthy() }) }) it('应该处理空值情况', async () => { const { getByText } = render() await waitFor(() => { expect(getByText('请选择省市区')).toBeTruthy() }) }) })