AreaCascader.test.tsx 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. import React from 'react'
  2. import { render, fireEvent, waitFor } from '@testing-library/react'
  3. import { AreaCascader } from '../../src/components/AreaCascader'
  4. // Mock API调用
  5. jest.mock('../../src/api', () => ({
  6. areaClient: {
  7. provinces: {
  8. $get: jest.fn().mockResolvedValue({
  9. status: 200,
  10. json: jest.fn().mockResolvedValue([
  11. { id: 1, name: '北京市', level: 1 },
  12. { id: 2, name: '上海市', level: 1 },
  13. { id: 3, name: '广东省', level: 1 }
  14. ])
  15. })
  16. },
  17. cities: {
  18. $get: jest.fn().mockImplementation(({ query }) => {
  19. if (query.provinceId === 1) {
  20. return Promise.resolve({
  21. status: 200,
  22. json: jest.fn().mockResolvedValue([
  23. { id: 11, name: '北京市', level: 2, parentId: 1 }
  24. ])
  25. })
  26. }
  27. if (query.provinceId === 3) {
  28. return Promise.resolve({
  29. status: 200,
  30. json: jest.fn().mockResolvedValue([
  31. { id: 31, name: '广州市', level: 2, parentId: 3 },
  32. { id: 32, name: '深圳市', level: 2, parentId: 3 }
  33. ])
  34. })
  35. }
  36. return Promise.resolve({
  37. status: 200,
  38. json: jest.fn().mockResolvedValue([])
  39. })
  40. })
  41. },
  42. districts: {
  43. $get: jest.fn().mockImplementation(({ query }) => {
  44. if (query.cityId === 11) {
  45. return Promise.resolve({
  46. status: 200,
  47. json: jest.fn().mockResolvedValue([
  48. { id: 111, name: '朝阳区', level: 3, parentId: 11 },
  49. { id: 112, name: '海淀区', level: 3, parentId: 11 }
  50. ])
  51. })
  52. }
  53. return Promise.resolve({
  54. status: 200,
  55. json: jest.fn().mockResolvedValue([])
  56. })
  57. })
  58. }
  59. }
  60. }))
  61. describe('AreaCascader', () => {
  62. beforeEach(() => {
  63. jest.clearAllMocks()
  64. })
  65. it('应该正确渲染初始状态', async () => {
  66. const { getByText } = render(<AreaCascader />)
  67. await waitFor(() => {
  68. expect(getByText('请选择省份')).toBeTruthy()
  69. expect(getByText('请选择城市')).toBeTruthy()
  70. expect(getByText('请选择区县')).toBeTruthy()
  71. })
  72. })
  73. it('应该加载省份列表', async () => {
  74. const { getByText } = render(<AreaCascader />)
  75. await waitFor(() => {
  76. expect(getByText('北京市')).toBeTruthy()
  77. expect(getByText('上海市')).toBeTruthy()
  78. expect(getByText('广东省')).toBeTruthy()
  79. })
  80. })
  81. it('应该在选择省份后加载城市列表', async () => {
  82. const { getByText } = render(<AreaCascader />)
  83. await waitFor(() => {
  84. expect(getByText('北京市')).toBeTruthy()
  85. })
  86. // 模拟选择北京市
  87. const beijingPicker = getByText('北京市')
  88. fireEvent.click(beijingPicker)
  89. await waitFor(() => {
  90. expect(getByText('北京市')).toBeTruthy() // 城市列表中的北京市
  91. })
  92. })
  93. it('应该在选择城市后加载区县列表', async () => {
  94. const { getByText } = render(<AreaCascader />)
  95. await waitFor(() => {
  96. expect(getByText('北京市')).toBeTruthy()
  97. })
  98. // 选择省份
  99. const beijingProvince = getByText('北京市')
  100. fireEvent.click(beijingProvince)
  101. await waitFor(() => {
  102. expect(getByText('北京市')).toBeTruthy() // 城市
  103. })
  104. // 选择城市
  105. const beijingCity = getByText('北京市')
  106. fireEvent.click(beijingCity)
  107. await waitFor(() => {
  108. expect(getByText('朝阳区')).toBeTruthy()
  109. expect(getByText('海淀区')).toBeTruthy()
  110. })
  111. })
  112. it('应该正确触发onChange回调', async () => {
  113. const mockOnChange = jest.fn()
  114. const { getByText } = render(
  115. <AreaCascader onChange={mockOnChange} />
  116. )
  117. await waitFor(() => {
  118. expect(getByText('北京市')).toBeTruthy()
  119. })
  120. // 选择省份
  121. const beijingProvince = getByText('北京市')
  122. fireEvent.click(beijingProvince)
  123. await waitFor(() => {
  124. expect(mockOnChange).toHaveBeenCalledWith([1])
  125. })
  126. })
  127. it('应该正确显示已选择的值', async () => {
  128. const { getByText } = render(
  129. <AreaCascader value={[1, 11, 111]} />
  130. )
  131. await waitFor(() => {
  132. expect(getByText('北京市 北京市 朝阳区')).toBeTruthy()
  133. })
  134. })
  135. it('应该处理空值情况', async () => {
  136. const { getByText } = render(<AreaCascader value={[]} />)
  137. await waitFor(() => {
  138. expect(getByText('请选择省市区')).toBeTruthy()
  139. })
  140. })
  141. })