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

