blob: cd753fc5803b3f758fbfddf06d7612cb2ee1caef [file] [log] [blame]
import React from 'react';
import { render, screen, waitFor } from '@testing-library/react';
import '@testing-library/jest-dom';
import { useApi } from '@/hooks/request';
import PostsPanel from '@/components/postsPanel/postsPanel';
// 模拟 useApi
jest.mock('@/hooks/request', () => ({
useApi: jest.fn(() => ({
data: [], // 默认返回空数组
loading: false,
error: null,
})),
}));
describe('PostsPanel Component', () => {
const mockUseApi = useApi as jest.MockedFunction<typeof useApi>;
it('renders the component with a title', () => {
// 渲染组件
render(<PostsPanel name="热门帖子" url="/api/posts" limit={5} />);
// 验证标题是否正确渲染
expect(screen.getByText('热门帖子')).toBeInTheDocument();
expect(screen.getByText('更多')).toBeInTheDocument();
});
it('renders posts when data is available', async () => {
// 模拟 API 返回数据
mockUseApi.mockReturnValue({
data: [
{ title: 'Post 1', date: '2025-04-01' },
{ title: 'Post 2', date: '2025-04-02' },
],
});
// 渲染组件
render(<PostsPanel name="热门帖子" url="/api/posts" limit={5} />);
// 验证数据是否正确渲染
await waitFor(() => {
expect(screen.getByText('Post 1')).toBeInTheDocument();
expect(screen.getByText('2025-04-01')).toBeInTheDocument();
expect(screen.getByText('Post 2')).toBeInTheDocument();
expect(screen.getByText('2025-04-02')).toBeInTheDocument();
});
});
it('renders a message when no data is available', async () => {
// 模拟 API 返回空数据
mockUseApi.mockReturnValue({
data: [],
});
// 渲染组件
render(<PostsPanel name="热门帖子" url="/api/posts" limit={5} />);
// 验证无数据时的提示信息
await waitFor(() => {
expect(screen.getByText('未查询到相关记录')).toBeInTheDocument();
});
});
it('handles loading state', () => {
// 模拟加载状态
mockUseApi.mockReturnValue({
data: null,
});
// 渲染组件
render(<PostsPanel name="热门帖子" url="/api/posts" limit={5} />);
// 验证组件是否正确渲染(可以根据需求添加加载状态的测试)
expect(screen.getByText('未查询到相关记录')).toBeInTheDocument();
});
});