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

Cypress创建对象并复用对象值的问题求助

Cypress 异步数据复用解决方案

问题原因

你遇到的Item is not defined错误,核心是Cypress的异步执行机制:

  • cy.wait().then()是异步命令,回调里定义的Item是局部变量,外部代码会先于回调执行,自然拿不到这个变量;
  • 即使同步定义变量,也会因为异步命令的执行顺序,导致后续代码访问时变量还未被赋值。

可行解决方案

方案1:用别名存储对象,通过this访问(推荐同用例内复用)

把整个Item对象用cy.wrap().as()存为别名,在同一个测试用例里用this.别名直接访问(注意要用普通函数,不能用箭头函数):

cy.wait('@pageLoaded').then(({ response }) => {
  expect(response.statusCode).to.equal(200);
  const i = randomItem();
  const selectedItem = {
    Id: response.body.items[i].id,
    IpuCode: response.body.items[i].ipuCode,
    Description: response.body.items[i].description,
    PackSize: response.body.items[i].packSize,
    PackType: response.body.items[i].packType,
  };
  cy.wrap(selectedItem).as('selectedItem'); // 存储整个对象为别名
})

// 后续测试代码(需放在同一个it/test块里,且用function定义回调)
it('添加商品到购物车', function() {
  cy.addItemToShoppingCart(
    this.selectedItem.IpuCode, 
    pharmacyId, 
    this.selectedItem.Id, 
    currentDateTime
  );
})

方案2:用Cypress环境变量存储(适合跨用例复用)

把对象存入Cypress全局环境变量,后续直接通过Cypress.env()取出:

cy.wait('@pageLoaded').then(({ response }) => {
  expect(response.statusCode).to.equal(200);
  const i = randomItem();
  const selectedItem = {
    Id: response.body.items[i].id,
    IpuCode: response.body.items[i].ipuCode,
    Description: response.body.items[i].description,
    PackSize: response.body.items[i].packSize,
    PackType: response.body.items[i].packType,
  };
  Cypress.env('selectedItem', selectedItem); // 存入全局环境变量
})

// 后续任意位置直接调用
cy.addItemToShoppingCart(
  Cypress.env('selectedItem').IpuCode, 
  pharmacyId, 
  Cypress.env('selectedItem').Id, 
  currentDateTime
);

注意:环境变量是全局的,多测试用例并行时要注意避免变量覆盖。

方案3:链式调用then(最贴合Cypress异步模型)

所有依赖Item的操作都放在then链里,避免额外嵌套:

cy.wait('@pageLoaded').then(({ response }) => {
  expect(response.statusCode).to.equal(200);
  const i = randomItem();
  return {
    Id: response.body.items[i].id,
    IpuCode: response.body.items[i].ipuCode,
    Description: response.body.items[i].description,
    PackSize: response.body.items[i].packSize,
    PackType: response.body.items[i].packType,
  };
}).then((selectedItem) => {
  cy.addItemToShoppingCart(selectedItem.IpuCode, pharmacyId, selectedItem.Id, currentDateTime);
  // 还可以继续链式调用其他依赖该对象的命令
})

总结

你的需求完全可以实现,只是需要适配Cypress的异步特性。如果是同一个测试用例内复用,方案1最简洁;跨用例的话用方案2;如果不想多套一层结构,方案3的链式写法也能满足需求。

内容的提问来源于stack exchange,提问作者Martina Elle

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 09:32:04