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
相关产品推荐
相关产品推荐

