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

如何测试依赖工具函数的React组件?(Vitest场景)

ReservationCard组件的Vitest测试方案

一、验证日期格式化效果

针对formatDate工具函数的验证,有两种实用思路,按需选择:

1. 直接断言格式化后的日期文本

如果要确保组件最终展示的日期符合预期格式,直接测试页面渲染结果即可。前提是你明确formatDate对输入值的输出结果(比如假设"2024-12-24"会被格式化为"2024年12月24日"):

it("显示格式化后的预订日期", () => {
  const reservation = {
    label: "My reservation",
    startDate: "2024-12-24"
  };
  render(<ReservationCard reservation={reservation} showDetailDialog={() => {}} />);
  
  // 断言格式化后的日期文本存在且可见
  expect(screen.getByText("2024年12月24日")).toBeVisible();
});

2. Mock工具函数,验证调用逻辑

如果只想验证组件是否正确调用formatDate并传入了正确参数(工具函数自身的正确性应该单独在utils测试文件中验证),可以用Vitest的mock功能:

import { formatDate } from "./utils";

// Mock整个utils模块
vi.mock("./utils", () => ({
  formatDate: vi.fn(() => "模拟格式化日期")
}));

it("正确调用formatDate处理预订日期", () => {
  const reservation = {
    label: "My reservation",
    startDate: "2024-12-24"
  };
  render(<ReservationCard reservation={reservation} showDetailDialog={() => {}} />);
  
  // 验证formatDate被调用,且参数正确
  expect(formatDate).toHaveBeenCalledWith("2024-12-24");
  // 同时断言页面显示了mock的结果
  expect(screen.getByText("模拟格式化日期")).toBeVisible();
});

二、测试按钮点击与对话框交互

需要测试,因为按钮触发对话框是组件的核心交互逻辑,测试粒度分两种场景:

1. 仅验证触发逻辑(对话框由父组件控制)

如果showDetailDialog是父组件传递的回调,只需验证按钮点击时该回调被调用:

it("点击按钮触发showDetailDialog回调", () => {
  const mockShowDialog = vi.fn();
  const reservation = {
    label: "My reservation",
    startDate: "2024-12-24"
  };
  
  render(<ReservationCard reservation={reservation} showDetailDialog={mockShowDialog} />);
  
  // 模拟点击按钮
  screen.getByText("Open detail").click();
  
  // 验证回调被调用
  expect(mockShowDialog).toHaveBeenCalled();
});

2. 验证对话框渲染与内容(对话框由组件内部控制)

如果对话框由ReservationCard内部状态控制显示/隐藏,需要测试点击后对话框可见,且传递了正确的预订数据:

it("点击按钮打开详情对话框并显示正确内容", () => {
  const reservation = {
    label: "My reservation",
    startDate: "2024-12-24",
    guestCount: 2 // 假设的详情字段
  };
  
  render(<ReservationCard reservation={reservation} showDetailDialog={() => {}} />);
  
  // 点击按钮
  screen.getByText("Open detail").click();
  
  // 验证对话框可见
  expect(screen.getByRole("dialog")).toBeVisible();
  // 验证对话框内显示正确的详情
  expect(screen.getByText("客人数量: 2")).toBeVisible();
});

注意:DetailDialog自身的细节测试应该放在它的专属测试文件中,ReservationCard的测试只需验证能正确触发对话框显示、传递必要props即可。

内容的提问来源于stack exchange,提问作者m_novak

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 16:12:46