Cypress使用Fixture共享测试数据时出现Cannot read properties of undefined (reading 'data')错误的排查请求
解决Cypress中Fixture数据访问时的
Cannot read properties of undefined (reading 'data')错误 我来帮你拆解问题并给出修复方案,这个错误其实是常见的上下文绑定问题导致的:
问题核心原因
- 箭头函数的
this指向偏差:你在before钩子和it测试用例里都用了箭头函数,而箭头函数没有自己的this上下文,会继承外层作用域的this,这就导致你在before里赋值的this.data,在测试用例里根本访问不到——因为两个地方的this不是同一个对象。 - Fixture文件名不匹配:你的代码里调用的是
cy.fixture('example'),但你提到的是environment.json文件,Cypress默认会从cypress/fixtures目录读取文件,文件名必须对应才能加载到数据。 - 空选择器/大小写问题:代码里的
cy.get('')是空选择器,而且cy.get('Select')用了大写,Cypress的选择器是大小写敏感的,这也会导致后续操作失败。
修复后的完整代码
/// <reference types="Cypress" /> describe('MyFirstTestSuite', () => { // 把箭头函数改成普通函数,让this绑定到Cypress测试上下文 before(function() { // 如果你用的是environment.json,这里要改成'environment';如果想保留'example',就把fixture文件重命名为example.json cy.fixture('environment').then(function(data) { this.data = data; }); }); // 测试用例同样改用普通函数,才能正确访问this.data it('FirstTest case', function() { cy.visit('https://rahulshettyacademy.com/angularpractice/'); // 修正为页面中名字输入框的实际选择器 cy.get('input[name="name"]').type(this.data.name); // 把Select改成小写的select,匹配页面元素 cy.get('select').select(this.data.gender); }); // 第二个测试用例示例,同样用普通函数即可访问共享的fixture数据 it('SecondTest case', function() { cy.log(`Fixture中的名字:${this.data.name}`); // 这里可以继续编写依赖fixture数据的测试步骤 }); });
额外注意事项
- 确保你的fixture文件(比如
environment.json)放在cypress/fixtures目录下,内容如下:{ "name" : "Darshit", "gender": "Male" } - 如果你不习惯用
this,也可以用闭包变量来存储fixture数据,比如:let fixtureData; before(function() { cy.fixture('environment').then(data => { fixtureData = data; }); }); it('用闭包访问fixture数据', () => { cy.get('input[name="name"]').type(fixtureData.name); });
内容的提问来源于stack exchange,提问作者Darshit Jain
相关产品推荐
相关产品推荐

