LangDropdown.spec.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. import { describe, it, expect, vi, beforeEach } from 'vitest'
  2. import { mount, flushPromises } from '@vue/test-utils'
  3. import { createPinia, setActivePinia } from 'pinia'
  4. import LangDropdown from '@/components/LangDropdown.vue'
  5. import { useAppStore } from '@/store/app'
  6. // Mock i18n
  7. vi.mock('@/locales', () => ({
  8. default: {
  9. global: {
  10. locale: { value: 'zh-cn' }
  11. }
  12. }
  13. }))
  14. describe('LangDropdown Component', () => {
  15. beforeEach(() => {
  16. setActivePinia(createPinia())
  17. vi.clearAllMocks()
  18. localStorage.clear()
  19. })
  20. const mountLangDropdown = () => {
  21. return mount(LangDropdown, {
  22. global: {
  23. plugins: [createPinia()],
  24. stubs: {
  25. 'el-dropdown': {
  26. template:
  27. '<div class="el-dropdown" @click="$emit(\'command\', \'en\')"><slot /><slot name="dropdown" /></div>',
  28. props: ['trigger']
  29. },
  30. 'el-dropdown-menu': { template: '<div class="el-dropdown-menu"><slot /></div>' },
  31. 'el-dropdown-item': {
  32. template: '<div class="el-dropdown-item" :class="{ active: active }"><slot /></div>',
  33. props: ['command', 'active']
  34. },
  35. 'el-icon': { template: '<span class="el-icon"><slot /></span>' },
  36. ArrowDown: { template: '<span>ArrowDown</span>' },
  37. Icon: { template: '<span class="iconify-icon"></span>', props: ['icon', 'width', 'height'] }
  38. }
  39. }
  40. })
  41. }
  42. describe('渲染', () => {
  43. it('应该正确渲染语言下拉组件', () => {
  44. const wrapper = mountLangDropdown()
  45. expect(wrapper.find('.lang-dropdown').exists()).toBe(true)
  46. })
  47. it('应该显示当前语言标签', () => {
  48. const wrapper = mountLangDropdown()
  49. expect(wrapper.find('.lang-trigger').exists()).toBe(true)
  50. })
  51. it('默认应该显示简体中文', () => {
  52. const wrapper = mountLangDropdown()
  53. expect(wrapper.text()).toContain('简体中文')
  54. })
  55. })
  56. describe('语言选项', () => {
  57. it('应该显示简体中文选项', () => {
  58. const wrapper = mountLangDropdown()
  59. expect(wrapper.text()).toContain('简体中文')
  60. })
  61. it('应该显示 English 选项', () => {
  62. const wrapper = mountLangDropdown()
  63. expect(wrapper.text()).toContain('English')
  64. })
  65. })
  66. describe('语言切换', () => {
  67. it('切换语言应该调用 changeLanguage', async () => {
  68. const wrapper = mountLangDropdown()
  69. const appStore = useAppStore()
  70. const changeSpy = vi.spyOn(appStore, 'changeLanguage')
  71. await wrapper.find('.el-dropdown').trigger('click')
  72. await flushPromises()
  73. expect(changeSpy).toHaveBeenCalledWith('en')
  74. })
  75. it('切换到英文后应该显示 English', async () => {
  76. const wrapper = mountLangDropdown()
  77. const appStore = useAppStore()
  78. appStore.changeLanguage('en')
  79. await flushPromises()
  80. expect(wrapper.text()).toContain('English')
  81. })
  82. })
  83. describe('当前语言高亮', () => {
  84. it('当前选中的语言应该有 active 类', () => {
  85. const wrapper = mountLangDropdown()
  86. expect(wrapper.html()).toBeDefined()
  87. })
  88. })
  89. })