在 Cypress 中使用 API 调用时如何避免 .then() 嵌套?

Gon*_*lan 5 javascript automated-tests e2e-testing cypress

我和我的团队正在尝试找到一种更易读的方法来处理 Cypress 中的依赖 API 调用。现在我们有一些类似这样的代码:

// nested code
      cy.request('GET', myUrl).its('body').then(res => {
        cy.request('GET', res).its('body').then(subRes => {
          cy.request('GET', subRes).its('body').then(subSubRes => {
            expect(subSubRes, myMessage).to.eq(myEvaluation);
          })
        })
      })
Run Code Online (Sandbox Code Playgroud)

我们也考虑过这个解决方案,但我认为我们在可读性方面并没有获得太多。

// less nested code?
      let response;
      let subResponse;
      cy.request('GET', myUrl).its('body').then(res => {
        response = res;
      })
      
      cy.then(() => {
        cy.request('GET', response).its('body').then(subRes => {
          subResponse = subRes;
        })
      })

      cy.then(() => {
        cy.request('GET', subResponse).its('body').then(subSubRes => {
          expect(subSubRes, myMessage).to.eq(myEvaluation);
        })
      })
Run Code Online (Sandbox Code Playgroud)

您有什么想法可以在不进入金字塔的情况下处理这种逻辑吗?提前致谢!

mbo*_*jko 15

就像是

cy.request('GET', myUrl).its('body')
    .then(res => cy.request('GET', res).its('body'))
    .then(subRes => cy.request('GET', subRes).its('body'))
    .then(subSubRes => {
        expect(subSubRes, myMessage).to.eq(myEvaluation);
    });
Run Code Online (Sandbox Code Playgroud)

应该管用。

  • 这是正确的。许多人往往忽略了“then()”是可链接的这一事实:如果“then()”的回调返回一个值,则该值将可用于下一个“then()”;更重要的是,如果返回的值本身是一个“Promise”,那么只有在“它本身被解析”之后,它的结果才会返回到下一个链接的“then()”。上面的代码利用了这个优雅的功能。 (2认同)