test: 修复测试中的 act() 警告和 clipboard mock 问题

- TextInputArea: 使用 userEvent 替代 fireEvent,用 vi.spyOn 替代 Object.assign mock clipboard
- ImageMode/FileMode: 添加 waitForStorageReady() 等待 useStorageState 异步初始化
This commit is contained in:
雨霖铃
2026-05-21 22:06:09 +08:00
parent f76fc3c140
commit f1f0047928
3 changed files with 30 additions and 24 deletions
+14 -22
View File
@@ -1,5 +1,6 @@
import { describe, expect, it, vi } from 'vitest';
import { fireEvent, render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
import TextInputArea from '@/components/TextInputArea';
describe('TextInputArea 组件', () => {
@@ -107,38 +108,32 @@ describe('TextInputArea 组件', () => {
});
it('复制时调用 showMessage', async () => {
const user = userEvent.setup();
const showMessage = vi.fn();
Object.assign(navigator, {
clipboard: { writeText: vi.fn().mockResolvedValue(undefined) },
});
const writeTextSpy = vi.spyOn(navigator.clipboard, 'writeText').mockResolvedValue(undefined);
render(
<TextInputArea value="测试" onChange={() => {}} allowCopy showMessage={showMessage} />,
);
fireEvent.click(screen.getByRole('button', { name: 'textInputArea.copyContent' }));
await user.click(screen.getByRole('button', { name: 'textInputArea.copyContent' }));
expect(navigator.clipboard.writeText).toHaveBeenCalledWith('测试');
await vi.waitFor(() => {
expect(showMessage).toHaveBeenCalledWith('messages.copySuccess', { severity: 'success' });
});
expect(writeTextSpy).toHaveBeenCalledWith('测试');
expect(showMessage).toHaveBeenCalledWith('messages.copySuccess', { severity: 'success' });
});
it('复制失败时调用 showMessage 错误提示', async () => {
const user = userEvent.setup();
const showMessage = vi.fn();
Object.assign(navigator, {
clipboard: { writeText: vi.fn().mockRejectedValue(new Error('失败')) },
});
vi.spyOn(navigator.clipboard, 'writeText').mockRejectedValue(new Error('失败'));
render(
<TextInputArea value="测试" onChange={() => {}} allowCopy showMessage={showMessage} />,
);
fireEvent.click(screen.getByRole('button', { name: 'textInputArea.copyContent' }));
await user.click(screen.getByRole('button', { name: 'textInputArea.copyContent' }));
await vi.waitFor(() => {
expect(showMessage).toHaveBeenCalledWith('messages.copyError', { severity: 'error' });
});
expect(showMessage).toHaveBeenCalledWith('messages.copyError', { severity: 'error' });
});
});
@@ -377,19 +372,16 @@ describe('TextInputArea 组件', () => {
describe('showMessage prop', () => {
it('复制成功时调用 showMessage', async () => {
const user = userEvent.setup();
const showMessage = vi.fn();
Object.assign(navigator, {
clipboard: { writeText: vi.fn().mockResolvedValue(undefined) },
});
vi.spyOn(navigator.clipboard, 'writeText').mockResolvedValue(undefined);
render(
<TextInputArea value="测试" onChange={() => {}} allowCopy showMessage={showMessage} />,
);
fireEvent.click(screen.getByRole('button', { name: 'textInputArea.copyContent' }));
await user.click(screen.getByRole('button', { name: 'textInputArea.copyContent' }));
await vi.waitFor(() => {
expect(showMessage).toHaveBeenCalledWith('messages.copySuccess', { severity: 'success' });
});
expect(showMessage).toHaveBeenCalledWith('messages.copySuccess', { severity: 'success' });
});
});