fix(types): 修复 16 个 TypeScript 类型检查错误

- 修复 animations.test.tsx 中的 Variant 类型访问问题
- 清理 9 个测试文件中的未使用导入
- 使用可选链操作符处理可能为 undefined 的属性访问
- 修复 mock 组件缺少 displayName 的 ESLint 错误
This commit is contained in:
张翔
2026-04-22 19:47:52 +08:00
parent 92ab2a83d5
commit 84f488a253
10 changed files with 16 additions and 32 deletions
+4 -2
View File
@@ -1,4 +1,4 @@
import { describe, it, expect, jest, beforeAll } from '@jest/globals'; import { describe, it, expect, jest } from '@jest/globals';
import { render, screen } from '@testing-library/react'; import { render, screen } from '@testing-library/react';
import '@testing-library/jest-dom'; import '@testing-library/jest-dom';
@@ -35,11 +35,13 @@ jest.mock('framer-motion', () => ({
})); }));
jest.mock('next/link', () => { jest.mock('next/link', () => {
return ({ children, href, ...props }: any) => ( const MockLink = ({ children, href, ...props }: any) => (
<a href={href} {...props}> <a href={href} {...props}>
{children} {children}
</a> </a>
); );
MockLink.displayName = 'MockLink';
return MockLink;
}); });
jest.mock('lucide-react', () => ({ jest.mock('lucide-react', () => ({
@@ -11,28 +11,13 @@ jest.mock('next/navigation', () => ({
})); }));
jest.mock('next/link', () => { jest.mock('next/link', () => {
return ({ children, href }: { children: React.ReactNode; href: string }) => { const MockLink = ({ children, href }: { children: React.ReactNode; href: string }) => {
return <a href={href}>{children}</a>; return <a href={href}>{children}</a>;
}; };
MockLink.displayName = 'MockLink';
return MockLink;
}); });
const mockProduct = {
id: 'test-product',
title: '测试产品',
category: '企业软件',
description: '这是测试产品描述',
overview: '这是测试产品概述',
features: ['功能1', '功能2'],
benefits: ['优势1', '优势2'],
process: ['步骤1', '步骤2'],
specs: ['规格1', '规格2'],
pricing: {
base: '¥10,000/年',
standard: '¥30,000/年',
enterprise: '定制',
},
};
jest.mock('@/lib/constants', () => ({ jest.mock('@/lib/constants', () => ({
PRODUCTS: [ PRODUCTS: [
{ {
+1 -1
View File
@@ -1,5 +1,5 @@
import { describe, it, expect, beforeEach, jest } from '@jest/globals'; import { describe, it, expect, beforeEach, jest } from '@jest/globals';
import { render, screen, fireEvent } from '@testing-library/react'; import { render, screen } from '@testing-library/react';
import '@testing-library/jest-dom'; import '@testing-library/jest-dom';
import { ErrorBoundary } from './error-boundary'; import { ErrorBoundary } from './error-boundary';
+1 -1
View File
@@ -1,6 +1,6 @@
import * as React from 'react'; import * as React from 'react';
import { describe, it, expect, jest, beforeEach } from '@jest/globals'; import { describe, it, expect, jest, beforeEach } from '@jest/globals';
import { render, screen, fireEvent } from '@testing-library/react'; import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event'; import userEvent from '@testing-library/user-event';
import '@testing-library/jest-dom'; import '@testing-library/jest-dom';
import { Input } from './input'; import { Input } from './input';
+1 -1
View File
@@ -1,5 +1,5 @@
import { describe, it, expect } from '@jest/globals'; import { describe, it, expect } from '@jest/globals';
import { render, screen } from '@testing-library/react'; import { render } from '@testing-library/react';
import '@testing-library/jest-dom'; import '@testing-library/jest-dom';
import { import {
Skeleton, Skeleton,
-2
View File
@@ -34,8 +34,6 @@ jest.mock('framer-motion', () => ({
AnimatePresence: ({ children }: { children: React.ReactNode }) => <>{children}</>, AnimatePresence: ({ children }: { children: React.ReactNode }) => <>{children}</>,
})); }));
const { RippleButton } = jest.requireActual('./ripple-button');
describe('RippleButton', () => { describe('RippleButton', () => {
beforeEach(() => { beforeEach(() => {
jest.clearAllMocks(); jest.clearAllMocks();
-1
View File
@@ -9,7 +9,6 @@ import {
SheetFooter, SheetFooter,
SheetTitle, SheetTitle,
SheetDescription, SheetDescription,
SheetClose,
} from './sheet'; } from './sheet';
describe('Sheet', () => { describe('Sheet', () => {
+1 -1
View File
@@ -1,6 +1,6 @@
import * as React from 'react'; import * as React from 'react';
import { describe, it, expect, jest, beforeEach } from '@jest/globals'; import { describe, it, expect, jest, beforeEach } from '@jest/globals';
import { render, screen, fireEvent } from '@testing-library/react'; import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event'; import userEvent from '@testing-library/user-event';
import '@testing-library/jest-dom'; import '@testing-library/jest-dom';
import { Textarea } from './textarea'; import { Textarea } from './textarea';
+1 -1
View File
@@ -1,5 +1,5 @@
import { describe, it, expect, beforeEach, jest } from '@jest/globals'; import { describe, it, expect, beforeEach, jest } from '@jest/globals';
import { renderHook, act } from '@testing-library/react'; import { renderHook } from '@testing-library/react';
import { useFocusTrap } from './use-focus-trap'; import { useFocusTrap } from './use-focus-trap';
describe('useFocusTrap', () => { describe('useFocusTrap', () => {
+4 -4
View File
@@ -77,7 +77,7 @@ describe('Animation Variants', () => {
it('should have correct transition configuration', async () => { it('should have correct transition configuration', async () => {
const { inkVariants } = await import('./animations'); const { inkVariants } = await import('./animations');
const transition = inkVariants.visible.transition as any; const transition = (inkVariants.visible as any)?.transition;
expect(transition.duration).toBe(0.8); expect(transition.duration).toBe(0.8);
expect(transition.ease).toEqual([0.16, 1, 0.3, 1]); expect(transition.ease).toEqual([0.16, 1, 0.3, 1]);
}); });
@@ -102,7 +102,7 @@ describe('Animation Variants', () => {
it('should use spring animation', async () => { it('should use spring animation', async () => {
const { sealStampVariants } = await import('./animations'); const { sealStampVariants } = await import('./animations');
const transition = sealStampVariants.visible.transition as any; const transition = (sealStampVariants.visible as any)?.transition;
expect(transition.type).toBe('spring'); expect(transition.type).toBe('spring');
expect(transition.stiffness).toBe(300); expect(transition.stiffness).toBe(300);
expect(transition.damping).toBe(20); expect(transition.damping).toBe(20);
@@ -144,7 +144,7 @@ describe('Animation Variants', () => {
describe('staggerContainerVariants', () => { describe('staggerContainerVariants', () => {
it('should have staggerChildren configured', async () => { it('should have staggerChildren configured', async () => {
const { staggerContainerVariants } = await import('./animations'); const { staggerContainerVariants } = await import('./animations');
const transition = staggerContainerVariants.visible.transition as any; const transition = (staggerContainerVariants.visible as any)?.transition;
expect(transition.staggerChildren).toBe(0.1); expect(transition.staggerChildren).toBe(0.1);
expect(transition.delayChildren).toBe(0.1); expect(transition.delayChildren).toBe(0.1);
}); });
@@ -412,7 +412,7 @@ describe('Animation Components', () => {
const { GlitchText } = await import('./animations'); const { GlitchText } = await import('./animations');
render(<GlitchText text="Test" className="glitch-class" />); render(<GlitchText text="Test" className="glitch-class" />);
const testElements = screen.getAllByText('Test'); const testElements = screen.getAllByText('Test');
const container = testElements[0].closest('.glitch-class'); const container = testElements[0]?.closest('.glitch-class');
expect(container).toBeInTheDocument(); expect(container).toBeInTheDocument();
}); });
}); });