Files
xiaoxia-saas/apps/web/src/test/components/layout/AppLayout.test.tsx
T
xiaoxia 280db0b862
CI/CD Pipeline / Check if frontend-only change (push) Has been skipped
CI/CD Pipeline / Frontend Unit Tests (push) Successful in 3m19s
CI/CD Pipeline / Frontend Lint (push) Successful in 4m24s
CI/CD Pipeline / Validate Code Quality And Tests (push) Successful in 4m48s
CI/CD Pipeline / Unit Tests (push) Successful in 5m28s
CI/CD Pipeline / Integration Tests (push) Successful in 1m34s
CI Build & Deploy Pipeline / Deploy Staging (Watchtower auto-deploy) (push) Successful in 53s
CI Build & Deploy Pipeline / Build Staging API Image (push) Successful in 6m43s
CI Build & Deploy Pipeline / Build Staging Web Image (push) Successful in 1m48s
CI Build & Deploy Pipeline / Build Staging Worker Image (push) Successful in 8m36s
CI Build & Deploy Pipeline / Build Production API Image (push) Has been skipped
CI Build & Deploy Pipeline / Build Production Web Image (push) Has been skipped
CI Build & Deploy Pipeline / Build Production Worker Image (push) Has been skipped
CI Build & Deploy Pipeline / Deploy Production (push) Has been skipped
CI Build & Deploy Pipeline / Production Browser E2E (push) Has been skipped
CI Build & Deploy Pipeline / Staging E2E Tests (push) Failing after 1m14s
CI Build & Deploy Pipeline / Staging API Integration Tests (push) Successful in 3m3s
test: 前端单测覆盖率Phase2+3,行覆盖率22%→51% (#575)
Co-authored-by: xiaoxia <dev@xiaoxiajianji.com>
Co-committed-by: xiaoxia <dev@xiaoxiajianji.com>
2026-07-19 12:18:31 +08:00

53 lines
1.8 KiB
TypeScript

/**
* AppLayout 组件测试
*/
import React from "react"
import { describe, it, expect, vi } from "vitest"
import { render, screen } from "@testing-library/react"
import { MemoryRouter } from "react-router-dom"
// mock Header 组件
vi.mock("@/components/layout/Header", () => ({
default: () => <header data-testid="mock-header">Mock Header</header>,
}))
// mock Outlet
vi.mock("react-router-dom", async () => {
const actual = await vi.importActual<typeof import("react-router-dom")>("react-router-dom")
return {
...actual,
Outlet: () => <div data-testid="mock-outlet">Outlet Content</div>,
}
})
import AppLayout from "@/components/layout/AppLayout"
const renderWithRouter = (ui: React.ReactElement) => {
return render(<MemoryRouter>{ui}</MemoryRouter>)
}
describe("AppLayout", () => {
it("应该渲染 Header", () => {
renderWithRouter(<AppLayout sidebar={<aside>侧边栏</aside>} />)
expect(screen.getByTestId("mock-header")).toBeInTheDocument()
})
it("应该渲染侧边栏", () => {
renderWithRouter(<AppLayout sidebar={<aside data-testid="sidebar">侧边栏内容</aside>} />)
expect(screen.getByTestId("sidebar")).toBeInTheDocument()
})
it("应该渲染 Outlet 内容", () => {
renderWithRouter(<AppLayout sidebar={<aside>侧边栏</aside>} />)
expect(screen.getByTestId("mock-outlet")).toBeInTheDocument()
})
it("应该包含正确的语义化结构", () => {
const { container } = renderWithRouter(<AppLayout sidebar={<aside>侧边栏</aside>} />)
expect(container.querySelector(".xx-app-shell")).toBeInTheDocument()
expect(container.querySelector(".xx-app-body")).toBeInTheDocument()
expect(container.querySelector(".xx-app-content")).toBeInTheDocument()
expect(container.querySelector("main")).toBeInTheDocument()
})
})