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

写入Fixture文件后无法读取数据:Cypress日志打印时机问题

问题原因分析

你的问题本质是两个关键点导致的:

  • this.AppelData是在beforeEach阶段从fixture加载的初始静态数据,后续你修改的是cy.readFile返回的局部变量AppelData,并没有更新this.AppelData。所以首次运行时this.AppelData.AppelID不存在,第二次运行时this.AppelData还是之前beforeEach加载的旧数据。
  • cy.writeFile是异步命令,虽然Cypress会按命令队列顺序执行,但你直接调用cy.log(this.AppelData.AppelID)时,拿的是外部上下文的旧值,不是刚写入文件的新值。

解决办法

办法一:直接用修改后的局部变量打印

既然你已经在cy.readFile的回调里拿到了修改后的AppelData,直接用这个变量打印即可,同时要把cy.log放在cy.writeFile的命令链之后,确保文件写入完成后再执行打印:

cy.wait('@response').get('@response').then(xhr => {
  console.log(xhr)
  cy.readFile('cypress/fixtures/AppelData.json').then(AppelData => {
    AppelData.AppelID = xhr.request.url.replace(/\D/g,'').replace(/3/, '')
    cy.writeFile('cypress/fixtures/AppelData.json', AppelData)
      .then(() => { // 等待文件写入完成
        cy.log(AppelData.AppelID) // 使用修改后的局部变量,而非this.AppelData
      })
  })
})

办法二:更新上下文的this.AppelData再打印

如果后续测试步骤需要用到这个新的AppelID,可以在文件写入完成后更新this.AppelData:

cy.wait('@response').get('@response').then(xhr => {
  console.log(xhr)
  cy.readFile('cypress/fixtures/AppelData.json').then(AppelData => {
    AppelData.AppelID = xhr.request.url.replace(/\D/g,'').replace(/3/, '')
    cy.writeFile('cypress/fixtures/AppelData.json', AppelData)
      .then(() => {
        this.AppelData = AppelData // 更新上下文里的对象
        cy.log(this.AppelData.AppelID)
      })
  })
})

额外提示

其实没必要在打印前重新读取文件,因为你已经在内存中修改了AppelData变量,cy.writeFile只是把内存中的数据同步到文件而已,直接用内存里的最新值打印效率更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 17:01:37