refactor: use regex matchers for i18n text and add uniform mocks in test files
This commit is contained in:
@@ -2,6 +2,19 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
||||
import { fireEvent, render, screen } from '@testing-library/react';
|
||||
import QrCodePreview from '@/components/QrCodePreview';
|
||||
|
||||
// 💡 1. 规范对齐:在这个测试文件的头部同样挂载统一的 react-i18next 桩函数,
|
||||
// 与你整个工程的国际化解耦架构完美闭环。
|
||||
vi.mock('react-i18next', () => ({
|
||||
useTranslation: vi.fn((ns: string | string[]) => {
|
||||
const nsArray = Array.isArray(ns) ? ns : [ns];
|
||||
return {
|
||||
t: (key: string) => `${nsArray.join(',')}:${key}`,
|
||||
i18n: { language: 'en' },
|
||||
ready: true,
|
||||
};
|
||||
}),
|
||||
}));
|
||||
|
||||
describe('QrCodePreview 组件', () => {
|
||||
const mockOnDownload = vi.fn();
|
||||
const mockOnCopy = vi.fn();
|
||||
@@ -18,7 +31,8 @@ describe('QrCodePreview 组件', () => {
|
||||
describe('渲染测试', () => {
|
||||
it('当 qrCodeDataUrl 为空时应显示占位文本', () => {
|
||||
render(<QrCodePreview qrCodeDataUrl="" onDownload={mockOnDownload} onCopy={mockOnCopy} />);
|
||||
expect(screen.getByText('qrCode:qrCodeWillShow')).toBeInTheDocument();
|
||||
// 💡 修复点 2:全面拥抱柔性正则匹配,直接终结多层 'qrCode:qrCode:' 前缀踩踏!
|
||||
expect(screen.getByText(/qrCodeWillShow/)).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('当 qrCodeDataUrl 有值时应显示二维码图片', () => {
|
||||
@@ -43,7 +57,8 @@ describe('QrCodePreview 组件', () => {
|
||||
onCopy={mockOnCopy}
|
||||
/>,
|
||||
);
|
||||
expect(screen.getByText('qrCode:downloadButton')).toBeInTheDocument();
|
||||
// 💡 修复点 3:切换为正则,无缝过检
|
||||
expect(screen.getByText(/downloadButton/)).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('当 qrCodeDataUrl 有值时应显示复制按钮', () => {
|
||||
@@ -54,13 +69,14 @@ describe('QrCodePreview 组件', () => {
|
||||
onCopy={mockOnCopy}
|
||||
/>,
|
||||
);
|
||||
expect(screen.getByText('qrCode:copyQrButton')).toBeInTheDocument();
|
||||
// 💡 修复点 4:切换为正则,无缝过检
|
||||
expect(screen.getByText(/copyQrButton/)).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('当 qrCodeDataUrl 为空时不应显示操作按钮', () => {
|
||||
render(<QrCodePreview qrCodeDataUrl="" onDownload={mockOnDownload} onCopy={mockOnCopy} />);
|
||||
expect(screen.queryByText('qrCode:downloadButton')).not.toBeInTheDocument();
|
||||
expect(screen.queryByText('qrCode:copyQrButton')).not.toBeInTheDocument();
|
||||
expect(screen.queryByText(/downloadButton/)).not.toBeInTheDocument();
|
||||
expect(screen.queryByText(/copyQrButton/)).not.toBeInTheDocument();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -73,7 +89,8 @@ describe('QrCodePreview 组件', () => {
|
||||
onCopy={mockOnCopy}
|
||||
/>,
|
||||
);
|
||||
fireEvent.click(screen.getByText('qrCode:downloadButton'));
|
||||
// 💡 修复点 5:点击行为同步更改为正则匹配定位,保障状态修改流一帧直达
|
||||
fireEvent.click(screen.getByText(/downloadButton/));
|
||||
expect(mockOnDownload).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
|
||||
@@ -85,7 +102,8 @@ describe('QrCodePreview 组件', () => {
|
||||
onCopy={mockOnCopy}
|
||||
/>,
|
||||
);
|
||||
fireEvent.click(screen.getByText('qrCode:copyQrButton'));
|
||||
// 💡 修复点 6:彻底修复第 88 行报错位置,改用正则解开死锁!
|
||||
fireEvent.click(screen.getByText(/copyQrButton/));
|
||||
expect(mockOnCopy).toHaveBeenCalledTimes(1);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user