/** * 前端单元测试套件 * * 使用 Vitest + Vue Test Utils 进行测试 */ import { describe, it, expect, vi, beforeEach } from 'vitest' import { mount, flushPromises } from '@vue/test-utils' import { createPinia, setActivePinia } from 'pinia' // ==================== 用户 Store 测试 ==================== describe('User Store', () => { let pinia beforeEach(() => { pinia = createPinia() setActivePinia(pinia) localStorage.clear() }) it('should initialize with empty token', async () => { const { useUserStore } = await import('@/stores/user.js') const userStore = useUserStore(pinia) expect(userStore.token).toBe('') expect(userStore.isLoggedIn).toBe(false) }) it('should initialize with token from localStorage', async () => { localStorage.setItem('access_token', 'test_token_123') const { useUserStore } = await import('@/stores/user.js') const store = useUserStore(pinia) expect(store.token).toBe('test_token_123') }) it('should logout and clear tokens', async () => { localStorage.setItem('access_token', 'test_token') localStorage.setItem('refresh_token', 'test_refresh') const { useUserStore } = await import('@/stores/user.js') const store = useUserStore(pinia) store.logout() expect(store.token).toBe('') expect(localStorage.getItem('access_token')).toBeNull() }) }) // ==================== 工具函数测试 ==================== describe('Utility Functions', () => { it('should format volume correctly', () => { const formatVolume = (volume) => { if (volume >= 100000000) { return (volume / 100000000).toFixed(2) + '亿' } else if (volume >= 10000) { return (volume / 10000).toFixed(2) + '万' } return volume.toString() } expect(formatVolume(150000000)).toBe('1.50 亿') expect(formatVolume(150000)).toBe('15.00 万') expect(formatVolume(1500)).toBe('1500') }) it('should format price correctly', () => { const formatPrice = (price) => { return price.toFixed(2) } expect(formatPrice(4000.5)).toBe('4000.50') expect(formatPrice(4000)).toBe('4000.00') }) it('should calculate price change correctly', () => { const calculateChange = (current, previous) => { return ((current - previous) / previous * 100).toFixed(2) } expect(calculateChange(4100, 4000)).toBe('2.50') expect(calculateChange(3900, 4000)).toBe('-2.50') }) }) // ==================== API 客户端测试 ==================== describe('API Client', () => { it('should include auth token in requests', () => { localStorage.setItem('access_token', 'test_token_123') expect(localStorage.getItem('access_token')).toBe('test_token_123') }) it('should handle 401 errors', () => { localStorage.removeItem('access_token') localStorage.removeItem('refresh_token') expect(localStorage.getItem('access_token')).toBeNull() }) })