import { render, screen, fireEvent } from '@testing-library/react'; import CopyButton from '../CopyButton'; import { vi } from 'vitest'; describe('CopyButton', () => { beforeEach(() => { vi.useFakeTimers(); }); afterEach(() => { vi.useRealTimers(); vi.clearAllMocks(); }); it('应该正确渲染默认文本', () => { render(); expect(screen.getByText('复制')).toBeInTheDocument(); }); it('应该正确渲染自定义按钮文本', () => { render(); expect(screen.getByText('Custom Copy')).toBeInTheDocument(); }); it('点击按钮时应该复制文本到剪贴板', async () => { const writeTextMock = vi.fn().mockResolvedValue(undefined); Object.defineProperty(navigator, 'clipboard', { value: { writeText: writeTextMock }, writable: true, }); render(); const button = screen.getByText('复制'); fireEvent.click(button); vi.advanceTimersByTime(300); expect(writeTextMock).toHaveBeenCalledWith('test content'); }); it('当没有提供要复制的文本时,应该在控制台警告', async () => { const consoleWarnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {}); render(); const button = screen.getByText('复制'); fireEvent.click(button); expect(consoleWarnSpy).toHaveBeenCalledWith('没有提供要复制的文本'); consoleWarnSpy.mockRestore(); }); });