JS Cypress:无法为数组使用别名

JS Cypress: unable to use alias for array

我对 Cypress 很陌生,我有一些 before() 调用命令通过 API 调用和 return 我在 after() 用于删除它们,但是如果我只 return 一个 ID 并存储在别名中,它会以某种方式完美地工作,但如果我将一组 ID 存储在别名中,它将失败,这是故意的还是我做错了什么。

在我的代码中:

before(() => {
  cy.setupEnv()
    .as('access_token')
    .then((token) => cy.setupFlow(token).as('data_id'))
})

after(function () {
  console.log(this.access_token)
  console.log(this.data_id)
})
如果 setupFlow return 只有一个 ID,

console.log(this.data_id) 显示正常,但如果我尝试 return [id1,id2,id3] 并使用 .as("data_id")

存储数组,则变得未定义

假设 cy.setupFlow(token) 生成类似于 [id1, id2, id3] 的值数组。即使数组中只有一个值,这也会起作用。每个人之后你应该看这个:

after(function () {
  cy.get('@data_id').then((data_id) => {
    //Get individual values
    cy.log(data_id[0])
    cy.log(data_id[1])
    cy.log(data_id[2])

    //Get all values using forEach
    data_id.forEach((id) => {
      cy.log(id) //get all values one by one
    })
  })
})

我为此创建了一个小型 POC,它正在运行,因为 expected.Below 是结果。

代码:

describe('SO Ques', () => {
  before(function () {
    cy.wrap([1, 2, 3]).as('array')
  })

  it('SO Ques', function () {
    cy.log('Hello')
  })

  after(function () {
    cy.get('@array').then((array) => {
      cy.log(array[0])
      cy.log(array[1])
      cy.log(array[2])
    })
  })
})

结果:

您遇到了一个奇怪的问题,值得向 Cypress 提出。

只有当您 不止一次测试时才会发生这种情况

例如,如果我 运行 以下它记录数组。

before(() => {
  cy.wrap(1).as('access_token')
  cy.then(() => {
    return [1,2,3]
  }).as('data_id')
})

after(function () {
  console.log(this.access_token)            // 1
  console.log(this.data_id)                 // [1,2,3]
})

it('test1', () => {
  console.log('test1')
  expect(true).to.eq(true)
})

如果我添加一个测试,它会记录 undefined!


before(() => {
  cy.wrap(1).as('access_token')
  cy.then(() => {
    return [1,2,3]
  }).as('data_id')
})

after(function () {
  console.log(this.access_token)            // 1
  console.log(this.data_id)                 // undefined
})

it('test1', () => {
  console.log('test1')
  expect(true).to.eq(true)
})

it('test2', () => {
  console.log('test2')
  expect(true).to.eq(true)
})

解决此问题的一种方法是使用 Cypress.env() 代替


before(() => {
  cy.wrap(1).as('access_token')
  cy.then(() => {
    Cypress.env('data_id', [1,2,3])
    return [1,2,3]
  }).as('data_id')
  console.log('before')
})

after(function () {
  console.log(this.access_token)            // 1
  console.log(this.data_id)                 // undefined
  console.log(Cypress.env('data_id'))       // [1,2,3]
})

beforeEach(function() {
  console.log(cy.state())
  console.log(this.data_id)
  cy.wrap(this.data_id).as('data_id')
})

it('test1', () => {
  expect(true).to.eq(true)
  console.log('test1')
})

it('test2', () => {
  console.log('test2')
  expect(true).to.eq(true)
})