import { describe, it, expect, vi, beforeEach } from 'vitest' import { mount } from '@vue/test-utils' import { setActivePinia, createPinia } from 'pinia' // Mock 面包屑组件的核心逻辑 describe('面包屑组件逻辑测试', () => { beforeEach(() => { setActivePinia(createPinia()) }) it('生成面包屑路径', () => { // 模拟面包屑路径生成逻辑 const mockPath = '/platLayout/system/user' const mockMenuData = [ { name: '系统管理', routerPath: '/platLayout/system', alias: 'system', children: [ { name: '用户管理', routerPath: '/platLayout/system/user', alias: 'user' } ] } ] // 模拟面包屑生成函数 function generateBreadcrumb(path: string, menuData: any[]) { const breadcrumb = [] const pathSegments = path.split('/').filter(Boolean) let currentMenu = menuData[0] breadcrumb.push({ name: currentMenu.name, routerPath: currentMenu.routerPath, level: 1 }) if (currentMenu.children) { const childMenu = currentMenu.children.find(child => path.includes(child.routerPath) ) if (childMenu) { breadcrumb.push({ name: childMenu.name, routerPath: childMenu.routerPath, level: 2 }) } } return breadcrumb } const result = generateBreadcrumb(mockPath, mockMenuData) expect(result).toHaveLength(2) expect(result[0].name).toBe('系统管理') expect(result[1].name).toBe('用户管理') }) it('处理单页面路由', () => { const singlePageMeta = { singlePage: true, label: '个人中心' } function generateSinglePageBreadcrumb(meta: any) { if (meta.singlePage) { return [{ name: meta.label, disabled: true }] } return [] } const result = generateSinglePageBreadcrumb(singlePageMeta) expect(result).toHaveLength(1) expect(result[0].name).toBe('个人中心') expect(result[0].disabled).toBe(true) }) it('判断面包屑项是否可点击', () => { const breadcrumbItems = [ { name: '系统管理', disabled: false, level: 1 }, { name: '用户管理', disabled: false, level: 2, isCurrentRoute: true } ] function isClickable(item: any, index: number, totalLength: number) { // 最后一项(当前路由)不可点击 if (index === totalLength - 1) return false // 禁用项不可点击 if (item.disabled) return false // 其他情况可点击 return true } expect(isClickable(breadcrumbItems[0], 0, 2)).toBe(true) expect(isClickable(breadcrumbItems[1], 1, 2)).toBe(false) }) it('处理面包屑隐藏逻辑', () => { function shouldHideBreadcrumb(breadcrumbLength: number, isCustomRouter: boolean, isHomePage: boolean) { return breadcrumbLength <= 1 && (isCustomRouter || isHomePage) } expect(shouldHideBreadcrumb(1, true, false)).toBe(true) expect(shouldHideBreadcrumb(1, false, true)).toBe(true) expect(shouldHideBreadcrumb(2, true, false)).toBe(false) expect(shouldHideBreadcrumb(1, false, false)).toBe(false) }) it('处理目录点击事件', () => { const mockEmit = vi.fn() function handleBreadcrumbClick(item: any, index: number, totalLength: number, emit: any) { // 检查是否可点击 if (index === totalLength - 1 || item.disabled) { return } if (item.isDirectory) { emit('directory-click', item) } else { // 模拟路由跳转 console.log('Navigate to:', item.routerPath) } } const directoryItem = { name: '系统管理', isDirectory: true, routerPath: '/system' } handleBreadcrumbClick(directoryItem, 0, 2, mockEmit) expect(mockEmit).toHaveBeenCalledWith('directory-click', directoryItem) }) })