You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用React测试库测试纯JS分页函数?测试无效果代码未覆盖

分页函数测试无效果、代码未覆盖问题解决

我编写了三个分页相关的纯JavaScript函数(handlePrev、handleNext、renderPageNumberButton),尝试使用React测试库对其进行测试,但测试无效果,代码行仍处于未覆盖状态。

待测试代码如下:

const handlePrev = (page, setPage) => {
  if (page > 1) {
    setPage(page - 1);
  }
};

const handleNext = (page, setPage, countPage) => {
  if (page < countPage) {
    setPage(page + 1);
  }
};

const renderPageNumberButton = (page, setPage, countPage) => {
  const buttons = [];

  for (let i = 1; i <= countPage; i++) {
    buttons.push(
      <button
        key={i}
        className={`${
          i === page ? "bg-zinc-500 text-zinc-300" : "bg-zinc-800 text-zinc-400"
        } w-10 h-10`}
        onClick={() => setPage(i)}
      >
        {i}
      </button>,
    );
  }

  return buttons;
};

export { handlePrev, handleNext, renderPageNumberButton };

针对性测试方案

1. handlePrev 函数测试

针对边界条件和正常逻辑编写测试,验证setPage的调用情况:

import { handlePrev } from './your-file-path'; // 替换为实际文件路径

test('当前页大于1时,handlePrev 调用setPage并传入page-1', () => {
  const mockSetPage = jest.fn();
  handlePrev(2, mockSetPage);
  expect(mockSetPage).toHaveBeenCalledWith(1);
});

test('当前页等于1时,handlePrev 不调用setPage', () => {
  const mockSetPage = jest.fn();
  handlePrev(1, mockSetPage);
  expect(mockSetPage).not.toHaveBeenCalled();
});

2. handleNext 函数测试

同样覆盖边界和正常逻辑:

import { handleNext } from './your-file-path';

test('当前页小于总页数时,handleNext 调用setPage并传入page+1', () => {
  const mockSetPage = jest.fn();
  handleNext(2, mockSetPage, 5);
  expect(mockSetPage).toHaveBeenCalledWith(3);
});

test('当前页等于总页数时,handleNext 不调用setPage', () => {
  const mockSetPage = jest.fn();
  handleNext(5, mockSetPage, 5);
  expect(mockSetPage).not.toHaveBeenCalled();
});

3. renderPageNumberButton 函数测试

该函数返回React元素,需渲染后验证渲染结果、样式和交互:

import { render, screen, fireEvent } from '@testing-library/react';
import { renderPageNumberButton } from './your-file-path';

test('renderPageNumberButton 渲染对应数量的页码按钮', () => {
  const mockSetPage = jest.fn();
  render(<div>{renderPageNumberButton(2, mockSetPage, 5)}</div>);
  
  // 验证1-5的按钮全部渲染
  for (let i = 1; i <= 5; i++) {
    expect(screen.getByText(i.toString())).toBeInTheDocument();
  }
});

test('renderPageNumberButton 当前页码按钮应用激活样式', () => {
  const mockSetPage = jest.fn();
  render(<div>{renderPageNumberButton(3, mockSetPage, 5)}</div>);
  
  const activeBtn = screen.getByText('3');
  expect(activeBtn).toHaveClass('bg-zinc-500', 'text-zinc-300');
  
  const inactiveBtn = screen.getByText('1');
  expect(inactiveBtn).toHaveClass('bg-zinc-800', 'text-zinc-400');
});

test('renderPageNumberButton 点击页码按钮触发setPage', () => {
  const mockSetPage = jest.fn();
  render(<div>{renderPageNumberButton(2, mockSetPage, 5)}</div>);
  
  fireEvent.click(screen.getByText('4'));
  expect(mockSetPage).toHaveBeenCalledWith(4);
});

内容的提问来源于stack exchange,提问作者Muhammad Khalish Zhafran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 04:05:26