From 7e58b5688fb6130c5399b0da4032f792c9765015 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=A8=E9=9C=96=E9=93=83?= Date: Fri, 22 May 2026 22:32:11 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E9=87=8D=E6=9E=84=20QrCode=20?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E4=B8=BA=E5=A3=B0=E6=98=8E=E5=BC=8F=E5=93=8D?= =?UTF-8?q?=E5=BA=94=E6=9E=B6=E6=9E=84=E5=B9=B6=E7=BB=9F=E4=B8=80=20shadcn?= =?UTF-8?q?=20=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pages/QrCode/__tests__/index.test.tsx | 38 +++-- pages/QrCode/components/GeneratePanel.tsx | 50 +++++-- pages/QrCode/components/ParsePanel.tsx | 48 ++++-- pages/QrCode/contexts/QrCodeContext.ts | 17 ++- pages/QrCode/hooks/useQrCode.ts | 169 +++++++++++----------- pages/QrCode/index.tsx | 50 +++++-- pages/QrCode/types.ts | 31 ++-- 7 files changed, 246 insertions(+), 157 deletions(-) diff --git a/pages/QrCode/__tests__/index.test.tsx b/pages/QrCode/__tests__/index.test.tsx index a3ed8d9..94532f3 100644 --- a/pages/QrCode/__tests__/index.test.tsx +++ b/pages/QrCode/__tests__/index.test.tsx @@ -1,7 +1,16 @@ -import { describe, it, expect, vi } from 'vitest'; -import { render, screen, fireEvent } from '@testing-library/react'; +import { describe, expect, it, vi } from 'vitest'; +import { fireEvent, render, screen } from '@testing-library/react'; import QrCodePage from '../index'; +// 💡 1. 规范回归:轻量级拦截 Mock lucide-react,杜绝一切在 JSDOM 虚拟环境中潜在的图标闪烁与属性未定义红牌 +vi.mock('lucide-react', () => ({ + QrCode: () =>
Icon
, + Type: () =>
Type
, + Upload: () =>
Upload
, + Image: () =>
Image
, + Trash2: () =>
Trash2
, +})); + // Mock useLazyTranslation vi.mock('@/utils/useLazyTranslation', () => ({ useLazyTranslation: () => ({ @@ -11,6 +20,13 @@ vi.mock('@/utils/useLazyTranslation', () => ({ }), })); +// Mock useSnackbar +vi.mock('@/components/GlobalSnackbar', () => ({ + useSnackbar: () => ({ + showMessage: vi.fn(), + }), +})); + // Mock getEntryPointType vi.mock('@/config/features', async (importOriginal) => { const actual = await importOriginal(); @@ -36,13 +52,6 @@ vi.mock('qrious', () => ({ })), })); -// Mock useSnackbar -vi.mock('@/components/GlobalSnackbar', () => ({ - useSnackbar: () => ({ - showMessage: vi.fn(), - }), -})); - describe('QrCodePage', () => { it('应该默认渲染生成模式', () => { render(); @@ -78,14 +87,19 @@ describe('QrCodePage', () => { expect(screen.getByTestId('qr-code-preview')).toBeInTheDocument(); }); - it('应该渲染输入区域', () => { + it('应该渲染输入区域的系统标签(对齐新版 Label 机制)', () => { render(); + // ✅ 完美对接:重构后不管是 Generate 还是 Parse 面板, + // 其外部包裹层里的标准独立