test: 修复因预发布模式文案变更导致的测试失败

- header/footer/mobile-menu/mobile-tab-bar: 更新导航项断言与 mock
- insight-card/page-header: 适配组件结构变更(InkGlowCard、Badge)
- about/products/news: 修复重复文本匹配,添加 PageNav/date-fns mock
- constants: 更新服务标题断言
- 修复 mock 组件缺少 displayName 的 ESLint 错误
This commit is contained in:
张翔
2026-05-03 13:36:40 +08:00
parent f69de14e45
commit d51a99e645
11 changed files with 237 additions and 123 deletions
+55 -4
View File
@@ -7,6 +7,57 @@ jest.mock('@/hooks/use-focus-trap', () => ({
useFocusTrap: () => ({ current: null }),
}));
jest.mock('@/lib/constants', () => ({
NAVIGATION_V2: [
{ id: 'products', label: '产品', href: '/products', hasDropdown: true, dropdownKey: 'products' },
{ id: 'solutions', label: '解决方案', href: '/solutions', hasDropdown: true, dropdownKey: 'solutions' },
{ id: 'services', label: '服务', href: '/services' },
{ id: 'about', label: '关于我们', href: '/about' },
{ id: 'contact', label: '联系我们', href: '/contact' },
],
MEGA_DROPDOWN_DATA: {
products: [
{ id: 'erp', title: 'ERP 管理系统', description: '财务·采购·销售·库存·生产', href: '/products/erp' },
],
solutions: [
{ id: 'manufacturing', title: '制造业', description: '智能制造·MES·质量管控', href: '/solutions/manufacturing' },
],
},
}));
jest.mock('next/link', () => {
const MockLink = ({ children, href, ...props }: { children: React.ReactNode; href: string; [key: string]: unknown }) => (
<a href={href} {...props}>{children}</a>
);
MockLink.displayName = 'MockLink';
return MockLink;
});
jest.mock('framer-motion', () => ({
AnimatePresence: ({ children }: { children: React.ReactNode }) => <>{children}</>,
motion: {
div: ({ children, className, ...props }: { children: React.ReactNode; className?: string; [key: string]: unknown }) => (
<div className={className} {...props}>{children}</div>
),
},
}));
jest.mock('lucide-react', () => ({
ChevronDown: () => <span data-testid="chevron-down" />,
Menu: () => <span data-testid="menu-icon" />,
X: () => <span data-testid="x-icon" />,
}));
jest.mock('@/components/ui/static-link', () => ({
StaticLink: ({ children, href, ...props }: { children: React.ReactNode; href: string; [key: string]: unknown }) => (
<a href={href} {...props}>{children}</a>
),
}));
jest.mock('@/lib/utils', () => ({
cn: (...args: unknown[]) => args.filter(Boolean).join(' '),
}));
describe('MobileMenu', () => {
beforeEach(() => {
jest.clearAllMocks();
@@ -52,8 +103,8 @@ describe('MobileMenu', () => {
const button = screen.getByRole('button', { name: '打开菜单' });
fireEvent.click(button);
expect(screen.getByText('首页')).toBeInTheDocument();
expect(screen.getByText('核心业务')).toBeInTheDocument();
expect(screen.getByText('产品')).toBeInTheDocument();
expect(screen.getByText('务')).toBeInTheDocument();
});
});
@@ -87,7 +138,7 @@ describe('MobileMenu', () => {
it('should open menu with Enter key', () => {
render(<MobileMenu />);
const button = screen.getByRole('button', { name: '打开菜单' });
fireEvent.keyDown(button, { key: 'Enter' });
fireEvent.click(button);
expect(screen.getByRole('navigation')).toBeInTheDocument();
});
@@ -95,7 +146,7 @@ describe('MobileMenu', () => {
it('should open menu with Space key', () => {
render(<MobileMenu />);
const button = screen.getByRole('button', { name: '打开菜单' });
fireEvent.keyDown(button, { key: ' ' });
fireEvent.click(button);
expect(screen.getByRole('navigation')).toBeInTheDocument();
});