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

Cypress使用Fixture共享测试数据时出现Cannot read properties of undefined (reading 'data')错误的排查请求

解决Cypress中Fixture数据访问时的Cannot read properties of undefined (reading 'data')错误

我来帮你拆解问题并给出修复方案,这个错误其实是常见的上下文绑定问题导致的:

问题核心原因

  1. 箭头函数的this指向偏差:你在before钩子和it测试用例里都用了箭头函数,而箭头函数没有自己的this上下文,会继承外层作用域的this,这就导致你在before里赋值的this.data,在测试用例里根本访问不到——因为两个地方的this不是同一个对象。
  2. Fixture文件名不匹配:你的代码里调用的是cy.fixture('example'),但你提到的是environment.json文件,Cypress默认会从cypress/fixtures目录读取文件,文件名必须对应才能加载到数据。
  3. 空选择器/大小写问题:代码里的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 21:47:33