Избегайте пирамиды при написании функции в commands.js

#cypress

Вопрос:

Как я могу избежать пирамиды, когда делаю что-то вроде этого примера?

 Cypress.Commands.add("test", () =gt; {   // first request  cy.request("POST", url1)  .its("body")  .then((response) =gt; {  let userId = response.user._id   // second request  cy.request("POST", url2)  .its("body")  .then((response) =gt; {  let adminAuth = response.accessToken   // third request  cy.request({  method: "POST",  url: url  headers: { "x-access-token": adminAuth },  body: { user: userId }  

Я чувствую , что вложенность, подобная этой, внутри then (), совершенно недостаточна.

Ответ №1:

Я почти уверен, что ответ Алапана не сработает, так как вы не можете получить значение переменной cypress в том же продолжении, где оно было определено. Переменная просто не была вычислена в данный момент (она не синхронна). Так что вы можете пойти этим путем:

 // first request cy.request("POST", url1)  .its("body")  .then((response) =gt; {  cy.wrap(response.user._id).as('userId')  })  // second request cy.request("POST", url2)  .its("body")  .then((response) =gt; {  cy.wrap(response.accessToken).as('adminAuth')  })  // accessing the variables inside a then block to let Cypress to compute them cy.wrap("").then(function() { // third request  cy.request({  method: "POST",  url: url,  headers: {  "x-access-token": this.adminAuth  },  body: {  user: this.userId  }  }) })  

Ответ №2:

Вы можете создать псевдоним, чтобы сохранить значение, а затем получить к нему доступ с помощью this. . Что-то вроде:

 // first request cy.request("POST", url1)  .its("body")  .then((response) =gt; {  cy.wrap(response.user._id).as('userId')  })  // second request cy.request("POST", url2)  .its("body")  .then((response) =gt; {  cy.wrap(response.accessToken).as('adminAuth')  })  // third request cy.request({  method: "POST",  url: url,  headers: {  "x-access-token": this.adminAuth  },  body: {  user: this.userId  } })