Cypress: 在测试中创建对象并重复使用对象的值

3

我对Cypress还不熟悉。我会感激任何提示和帮助。我的测试:

  1. 转到页面
  2. 解析来自服务器的响应
  3. 从该响应中获取任意项
  4. 然后,我想将该项保存到对象中以供稍后在测试中使用。
cy.wait('@pageLoaded').then(({ response }) => {
            expect(response.statusCode).to.equal(200);
            
            let i = randomItem();
            
            //Create an object
            const Item = {
                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,
            };
            
           //Here I'm getting the expected array
            cy.log(Item);
            
        })
        //And here I want to re-use it
        
        cy.addItemToShoppingCart(Item.value(IpuCode), pharmacyId, Item.value(Id), currentDateTime);



所以,我已经尝试过了。
cy.addItemToShoppingCart(Item.value(IpuCode), pharmacyId, Item.value(Id), currentDateTime);

结果:未定义项目
 cy.addItemToShoppingCart(Item.IpuCode, pharmacyId, Item.Id, currentDateTime);

结果:未定义项目
我也有一种可行的方法来获取值并使用它。
            cy.wait('@pageLoaded').then(({ response }) => {
                expect(response.statusCode).to.equal(200);
                
                let i = randomItem();
                let ItemGmsCode = response.body.items[i].gmsCode;
                cy.log(ItemGmsCode);
                cy.wrap(ItemGmsCode).as('itemGmsCode');
            })

但是我不喜欢每次都要将命令包裹在一个块中。
            cy.get('@itemGmsCode').then((gmsCode) => {
                //do soemthing
            })

或者我是不是想要不可能的事情?
1个回答

4

在测试中保存数据的内置机制是alias,您可以在代码中像这样使用它

cy.wait('@pageLoaded').then(({ response }) => {
  ...
  cy.wrap({
    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,
  }.as('item')
})

// later in the same test

cy.get('@item').then(item => {
  cy.addItemToShoppingCart(item.ipuCode, pharmacyId, item.id, currentDateTime)
})

在JavaScript中,常规做法是使用驼峰命名法,这意味着标识符的第一个字符应为小写。

谢谢你的建议,是的,我会考虑到你关于变量命名的观点。 - Martina Elle
我几乎可以确定 this.item.ipuCode 不会起作用,因为在评估它的时候,这个值还没有被计算出来。无论如何,你必须使用 then 回调函数。 - Mikhail Bolotov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接