fix(test): Header.test.tsx antd/icons mock 透传缺失导出(修复 Typography 未定义) #1947
@@ -45,49 +45,60 @@ vi.mock("@/config/navigation", () => ({
|
||||
],
|
||||
}))
|
||||
|
||||
// mock antd icons
|
||||
vi.mock("@ant-design/icons", () => ({
|
||||
LogoutOutlined: () => <span data-testid="logout-icon" />,
|
||||
SettingOutlined: () => <span data-testid="setting-icon" />,
|
||||
UserOutlined: () => <span data-testid="user-icon" />,
|
||||
MenuOutlined: () => <span data-testid="menu-icon" />,
|
||||
}))
|
||||
// mock antd icons — 透传未显式 mock 的图标,避免 PointsBadge 等子组件引用新图标时报错
|
||||
vi.mock("@ant-design/icons", async () => {
|
||||
const actual = (await vi.importActual<typeof import("@ant-design/icons")>(
|
||||
"@ant-design/icons",
|
||||
)) as Record<string, unknown>
|
||||
return {
|
||||
...actual,
|
||||
LogoutOutlined: () => <span data-testid="logout-icon" />,
|
||||
SettingOutlined: () => <span data-testid="setting-icon" />,
|
||||
UserOutlined: () => <span data-testid="user-icon" />,
|
||||
MenuOutlined: () => <span data-testid="menu-icon" />,
|
||||
}
|
||||
})
|
||||
|
||||
// mock antd components
|
||||
vi.mock("antd", () => ({
|
||||
Avatar: ({ children, className }: any) => (
|
||||
<span data-testid="mock-avatar" className={className}>
|
||||
{children}
|
||||
</span>
|
||||
),
|
||||
Dropdown: ({ children, menu }: any) => (
|
||||
<div data-testid="mock-dropdown">
|
||||
{children}
|
||||
<div data-testid="dropdown-menu" style={{ display: "none" }}>
|
||||
{menu.items?.map((item: any, idx: number) => (
|
||||
<div key={idx} data-testid={`menu-item-${item.key}`} onClick={item.onClick}>
|
||||
{item.label}
|
||||
</div>
|
||||
))}
|
||||
// mock antd components — 用 importActual 透传未显式覆盖的组件(Popover/Button/Tag/Typography/Badge 等),
|
||||
// 避免 Header 子组件(PointsBadge)使用新 antd 导出时出现 "No xxx export is defined on the antd mock"
|
||||
vi.mock("antd", async () => {
|
||||
const actual = (await vi.importActual<typeof import("antd")>("antd")) as Record<string, unknown>
|
||||
return {
|
||||
...actual,
|
||||
Avatar: ({ children, className }: any) => (
|
||||
<span data-testid="mock-avatar" className={className}>
|
||||
{children}
|
||||
</span>
|
||||
),
|
||||
Dropdown: ({ children, menu }: any) => (
|
||||
<div data-testid="mock-dropdown">
|
||||
{children}
|
||||
<div data-testid="dropdown-menu" style={{ display: "none" }}>
|
||||
{menu.items?.map((item: any, idx: number) => (
|
||||
<div key={idx} data-testid={`menu-item-${item.key}`} onClick={item.onClick}>
|
||||
{item.label}
|
||||
</div>
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
),
|
||||
Space: ({ children, className }: any) => (
|
||||
<div data-testid="mock-space" className={className}>
|
||||
{children}
|
||||
</div>
|
||||
),
|
||||
Drawer: ({ title, open, children, onClose, placement }: any) =>
|
||||
open ? (
|
||||
<div data-testid="mock-drawer" data-placement={placement}>
|
||||
<div data-testid="drawer-title">{title}</div>
|
||||
<button data-testid="drawer-close" onClick={onClose}>
|
||||
Close
|
||||
</button>
|
||||
),
|
||||
Space: ({ children, className }: any) => (
|
||||
<div data-testid="mock-space" className={className}>
|
||||
{children}
|
||||
</div>
|
||||
) : null,
|
||||
}))
|
||||
),
|
||||
Drawer: ({ title, open, children, onClose, placement }: any) =>
|
||||
open ? (
|
||||
<div data-testid="mock-drawer" data-placement={placement}>
|
||||
<div data-testid="drawer-title">{title}</div>
|
||||
<button data-testid="drawer-close" onClick={onClose}>
|
||||
Close
|
||||
</button>
|
||||
{children}
|
||||
</div>
|
||||
) : null,
|
||||
}
|
||||
})
|
||||
|
||||
// mock CSS
|
||||
vi.mock("@/components/layout/Header.css", () => ({}))
|
||||
|
||||
Reference in New Issue
Block a user