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

React+TypeScript项目中如何用Cypress验证图片排序功能?

解决方案:验证卡片列表的时间排序

核心思路

从每个图片卡片中提取日期信息,转换为可比较的Date对象,然后验证这些日期的顺序是否符合「最早在前」(升序)或「最新在前」(降序)的预期。


步骤1:替换硬等待,改用可靠的同步逻辑

先把测试里的cy.wait(3000)替换为更稳定的等待方式,避免因渲染或网络延迟导致断言失败:

  • 若排序依赖后端API,用cy.intercept拦截请求并等待完成:
// 测试前拦截排序接口
beforeEach(() => {
  cy.intercept('GET', '/api/files/*').as('getSortedFiles'); // 替换为实际的排序API路径
});

// 点击排序按钮后等待接口返回
cy.get('[data-cy=file-order-old]').click();
cy.wait('@getSortedFiles');
  • 若排序是前端本地处理,可等待列表元素更新:
cy.get('[data-cy=file-order-old]').click();
cy.get('[data-cy="each-item-file"]').should('have.length.greaterThan', 0);

步骤2:提取日期并验证排序顺序

方式一:不修改组件(使用现有选择器)

根据你的FileCard组件结构,日期文本位于className="fileDataMarginTop"的元素中,直接提取验证:

it('should sort files from oldest to newest when clicking "oldest" button', () => {
  cy.get('[data-cy=projects-card-table]').contains('E2E-TEST').click();
  cy.get('[data-cy="header-search-bar"]').click();
  
  cy.get('[data-cy=file-order-old]').click();
  cy.wait('@getSortedFiles'); // 替换为你的等待逻辑
  
  // 提取所有卡片的日期并转为Date对象
  cy.get('[data-cy="each-item-file"]')
    .find('.fileDataMarginTop')
    .then($dateElements => {
      const dates = Array.from($dateElements).map(el => {
        const dateText = el.textContent.trim();
        // 根据formatFullDate的输出格式转换,若为标准ISO格式直接用new Date即可
        return new Date(dateText);
      });
      
      // 验证日期升序(最早在前)
      for (let i = 0; i < dates.length - 1; i++) {
        expect(dates[i]).to.be.lessThan(dates[i + 1]);
      }
    });
});

方式二:修改组件(添加专属data-cy,更稳定)

为日期元素添加data-cy属性,避免样式类名变更导致选择器失效:
在FileCard的日期Typography中添加标记:

<Typography
  variant='h6'
  className={classes.fileDataMarginTop}
  color='primary'
  data-cy="file-item-date" // 添加此行
>
  {`${formatFullDate(new Date(file.file.date), i18n.language)}`}
</Typography>

测试代码中使用更可靠的选择器:

cy.get('[data-cy="each-item-file"]')
  .find('[data-cy="file-item-date"]')
  .then($dateElements => {
    const dates = Array.from($dateElements).map(el => new Date(el.textContent.trim()));
    for (let i = 0; i < dates.length - 1; i++) {
      expect(dates[i]).to.be.lessThan(dates[i + 1]);
    }
  });

处理国际化日期格式

如果formatFullDate输出本地化日期(比如中文的"2024年5月20日 14:30"),需自定义解析函数:

// 示例:解析中文格式日期
function parseChineseDate(dateText) {
  const match = dateText.match(/(\d{4})年(\d{1,2})月(\d{1,2})日 (\d{1,2}):(\d{1,2})/);
  if (match) {
    const [, year, month, day, hour, minute] = match;
    return new Date(year, month - 1, day, hour, minute); // 月份是0-based,需减1
  }
  throw new Error(`无法解析日期:${dateText}`);
}

// 测试中使用
const dates = Array.from($dateElements).map(el => parseChineseDate(el.textContent.trim()));

验证「最新」排序的逻辑

若要验证「最新」按钮的降序排列,只需修改断言:

for (let i = 0; i < dates.length - 1; i++) {
  expect(dates[i]).to.be.greaterThan(dates[i + 1]);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 00:10:26