import { vi } from 'vitest' // 设置全局测试超时时间 vi.setConfig({ testTimeout: 10000 }) // Mock window.matchMedia (用于响应式测试) Object.defineProperty(window, 'matchMedia', { writable: true, value: vi.fn().mockImplementation((query) => ({ matches: false, media: query, onchange: null, addListener: vi.fn(), removeListener: vi.fn(), addEventListener: vi.fn(), removeEventListener: vi.fn(), dispatchEvent: vi.fn(), })), }) // Mock IntersectionObserver (用于虚拟滚动测试) global.IntersectionObserver = class IntersectionObserver { constructor() {} disconnect() {} observe() {} takeRecords() { return [] } unobserve() {} } as any // Mock ResizeObserver (用于尺寸变化测试) global.ResizeObserver = class ResizeObserver { constructor() {} disconnect() {} observe() {} unobserve() {} } as any // Mock requestAnimationFrame global.requestAnimationFrame = (callback: FrameRequestCallback) => { return setTimeout(callback, 0) as unknown as number } global.cancelAnimationFrame = (id: number) => { clearTimeout(id) } // Mock HTMLCanvasElement (用于 html2canvas/jspdf 测试) if (!HTMLCanvasElement.prototype.getContext) { HTMLCanvasElement.prototype.getContext = vi.fn(() => ({ fillRect: vi.fn(), clearRect: vi.fn(), getImageData: vi.fn(), putImageData: vi.fn(), createImageData: vi.fn(), setTransform: vi.fn(), drawImage: vi.fn(), save: vi.fn(), fillText: vi.fn(), restore: vi.fn(), beginPath: vi.fn(), moveTo: vi.fn(), lineTo: vi.fn(), closePath: vi.fn(), stroke: vi.fn(), translate: vi.fn(), scale: vi.fn(), rotate: vi.fn(), arc: vi.fn(), fill: vi.fn(), measureText: vi.fn(() => ({ width: 0 })), transform: vi.fn(), rect: vi.fn(), clip: vi.fn(), })) as any } // Mock HTMLCanvasElement.toDataURL if (!HTMLCanvasElement.prototype.toDataURL) { HTMLCanvasElement.prototype.toDataURL = vi.fn(() => 'data:image/png;base64,') }