减少 cypress 中的回调嵌套

Bak*_*aki 6 javascript cypress cypress-origin

我读到在 Cypress 中我不应该使用它await,也不需要它,因为您可以通过链接删除嵌套。这里我有一个cy.fixure嵌套 incy.origin嵌套 in cy.session,有没有办法把它展平?

  cy.session([], () => {
    cy.visit("")
    cy.origin("https://my-address.com", () => {
      cy.fixture("user").then((user) => {
        cy.get("#username").type(user.username)
        cy.get("#password").type(user.password)
      })

      cy.get("button[type='submit']").click()
      cy.url().should("equal", "/login-success")
    })
  })
Run Code Online (Sandbox Code Playgroud)

编辑
这不是关于常规 javascript 的问题,它是Cypress特定的,正常的 async/await 在这里不起作用。

Car*_*Gee 7

不是真的(任何方式来压平)。正如您所说, async/await 不适用于 Cypress 命令,因为它们不是承诺。

好吧,您可以将承诺放在适当的位置并等待它们,但这很笨拙,而且实际上需要更多代码。

但是cy.session()cy.origin()是一些时髦的命令,它们仅因回调而起作用 - 或者更准确地说需要回调才能起作用。

cy.session()仅在第一次调用时触发回调,此后它会缓存会话数据并在第二次调用时返回它们,而不是重新调用回调。

cy.origin()使用回调为针对其他(指定)源运行的代码创建一个隔离的沙箱,它甚至不是 Javascript 意义上的回调,因为它不能对外部作用域中的变量使用闭包。

其中链接到该fixture()部分。通常您可以导入或需要夹具

const user = require('cypress/fixtures/user.json')
Run Code Online (Sandbox Code Playgroud)

但对于 cy.origin 来说这对你没有帮助,因为固定装置是在外部范围中导入的,并且在 cy.origin 沙箱内看不到。


对于创建 Promise 的插件,请参阅cypress-promise,但由于所述原因,它不能与 session 和 origin 一起使用。

import promisify from 'cypress-promise'
 
it('should run tests with async/await', async () => {
  const foo = await promisify(cy.wrap('foo'))
  const bar = await promisify(cy.wrap('bar'))
 
  expect(foo).to.equal('foo')
  expect(bar).to.equal('bar')
})
Run Code Online (Sandbox Code Playgroud)