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

Cypress测试中dayjs第二次调用未正确返回当前日期问题

问题根因

这个问题和dayjs本身无关,是Cypress的命令执行机制导致的。
Cypress的所有cy.*命令都是异步排队执行的:你写在测试用例里的cy.log、cy.wait不会在代码行运行时立刻执行,而是会被先加入执行队列,等前面的命令全部跑完才会依次执行。
但你写在cy.log()参数位置的dayjs(new Date())是普通同步JS代码,会在命令入队阶段就立刻执行求值,根本不会等待前面的cy.wait(5000)运行完成。
你的代码实际执行时序是:

  • 测试代码解析阶段:第一次执行dayjs(new Date())拿到当前时间,把打印这个时间的cy.log命令加入队列
  • 紧接着第二次执行dayjs(new Date())——此时5秒等待还根本没开始,两次计算时间差不到1毫秒,拿到的时间值完全一致,再把打印第二个时间的cy.log加入队列
  • 最后把cy.wait(5000)加入队列
  • Cypress开始按顺序执行队列:打印第一个时间、等待5秒、打印第二个时间。由于第二个时间值早在入队阶段就已经计算完成,所以两次日志输出的时间完全相同。
修复方案

要让时间计算在cy.wait执行完成后再触发,需要把dayjs的逻辑放到Cypress命令的回调中,保证逻辑在轮到对应命令执行时才会运行:

方案1:使用cy.then包裹时间计算逻辑

const dayjs = require('dayjs')
cy.then(() => {
  cy.log(dayjs(new Date()).format('DD/MM/YYYY HH:mm:ss'))
})
cy.wait(5000)
cy.then(() => {
  cy.log(dayjs(new Date()).format('DD/MM/YYYY HH:mm:ss'))
})

方案2:给cy.log传入函数参数

Cypress的cy.log支持传入函数作为消息参数,函数内的逻辑会在log实际执行时才运行,写法更简洁:

const dayjs = require('dayjs')
cy.log(() => dayjs(new Date()).format('DD/MM/YYYY HH:mm:ss'))
cy.wait(5000)
cy.log(() => dayjs(new Date()).format('DD/MM/YYYY HH:mm:ss'))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 11:24:42