Cypress中e2e的before()块执行cy.readFile抛出AssertionError
解决Cypress测试前检查fixtures文件存在性的问题
核心问题分析
Cypress的cy.readFile、cy.fixture这类命令默认期望目标文件存在,一旦文件不存在就会直接抛出断言错误终止流程,不会进入回调的分支判断;而Node原生的fs模块无法直接在测试代码中使用,因为测试代码运行在浏览器上下文,而非Node环境。
可行解决方案
1. 通过Cypress Task调用Node环境的fs模块
Cypress提供了cy.task机制,可以让测试代码调用运行在Node环境的逻辑,借此我们可以使用fs模块安全检查文件是否存在。
步骤1:在cypress.config.js中注册自定义Task
const { defineConfig } = require("cypress"); const fs = require('fs'); const path = require('path'); module.exports = defineConfig({ e2e: { setupNodeEvents(on, config) { on('task', { checkFileExists(filePath) { // 拼接项目根目录,生成绝对路径避免相对路径问题 const fullPath = path.resolve(config.projectRoot, filePath); return fs.existsSync(fullPath); } }); }, }, });
步骤2:在全局前置钩子中调用Task
修改你的e2e.js文件,通过自定义Task实现文件存在性检查:
require('./commands'); before(() => { const filePath = 'cypress/fixtures/mydata.json'; cy.task('checkFileExists', filePath).then((exists) => { if (exists) { cy.log(`File '${filePath}' exists.`); // 文件存在时的后续逻辑,比如读取文件内容 // cy.readFile(filePath).then(data => { ... }) } else { cy.log(`File '${filePath}' does not exist.`); // 可添加文件不存在时的处理,比如创建默认文件、跳过测试等 // 示例:cy.skip(); // 跳过所有后续测试用例 } }); });
补充说明
- 若需要在文件不存在时自动创建默认文件,可以扩展Task的逻辑,在
checkFileExists中添加fs.writeFileSync的逻辑。 - 避免直接在测试代码中使用
fs模块,因为浏览器上下文没有Node环境的API权限,必须通过cy.task中转。
内容的提问来源于stack exchange,提问作者佚名
相关产品推荐
相关产品推荐

