| import { describe, it, expect, vi, beforeEach } from 'vitest'; |
| import { render, screen } from '@testing-library/react'; |
| import { MemoryRouter, Routes, Route } from 'react-router-dom'; |
| import ProtectedRoute from './ProtectedRoute'; |
| |
| // 模拟 Navigate 组件 |
| vi.mock('react-router-dom', async () => { |
| const actual = await vi.importActual('react-router-dom'); |
| return { |
| ...actual, |
| Navigate: () => <div data-testid="navigate-mock">重定向到登录页</div>, |
| }; |
| }); |
| |
| describe('ProtectedRoute 组件', () => { |
| beforeEach(() => { |
| window.localStorage.clear(); |
| }); |
| |
| it('未登录时应该重定向到登录页', () => { |
| render( |
| <MemoryRouter> |
| <ProtectedRoute> |
| <div>受保护的内容</div> |
| </ProtectedRoute> |
| </MemoryRouter> |
| ); |
| |
| // 应该看到重定向组件 |
| expect(screen.getByTestId('navigate-mock')).toBeInTheDocument(); |
| }); |
| |
| it('已登录时应该显示子组件', () => { |
| // 模拟已登录状态 |
| window.localStorage.setItem('token', 'fake-token'); |
| |
| render( |
| <MemoryRouter> |
| <ProtectedRoute> |
| <div>受保护的内容</div> |
| </ProtectedRoute> |
| </MemoryRouter> |
| ); |
| |
| // 应该看到受保护的内容 |
| expect(screen.getByText('受保护的内容')).toBeInTheDocument(); |
| }); |
| }); |