Ожидание асинхронного метода для цикла в Cypress - PullRequest
0 голосов
/ 10 октября 2018

Редактировать: Почему это не дубликат: потому что Cypress , просто прочитайте вместо того, чтобы пометить все как дубликаты.

Редактировать 2: Также см. Ответ для лучшего понимания различий междуобычный async for зацикливает проблемы и этот вопрос.


Я пишу кипарисовые тесты и хочу создать команду кипариса, которая наполняет мою базу данных списком пользователей.Я хочу, чтобы цикл создания ожидал создания каждого пользователя, прежде чем он перейдет к следующему (потому что я хочу, чтобы это было сделано в определенном порядке).

На данный момент мой цикл выглядит следующим образом:

Cypress.Commands.add("populateDb", (users) => {
  var createdItems = []

  for (const user of users) {
    cy.createUser(user, 'passe').then(response => {
      createdUsers.unshift(response.body.user)
    })
  }
  return createdItems
})

Конечно, этот цикл не ожидает создания каждого пользователя, прежде чем перейти к следующему (я хочу 'последовательную обработку', НЕ 'параллельно, а затем ждать всех обещанийрешить ')

Я прочитал ответы об асинхронном цикле for здесь:

Но я не могу показатьсячтобы найти то, что я хочу, главным образом потому, что Cypress не позволяет мне объявить мою функцию как асинхронную следующим образом:

Cypress.Commands.add("populateDb", async (users) => {
    //Some code
})

И если я не объявляю это async, я не могу использовать await.

Не существует ли какой-нибудь метод короля get(), который просто синхронно ожидает разрешения Обещания?

1 Ответ

0 голосов
/ 12 октября 2018

Оказывается, что существует причина, по которой Cypress так ограничен в отношении того, что вы можете делать с ожиданием разрешения асинхронного метода: он всегда автоматически запускает все асинхронные команды в последовательном порядке, как они вызываются, а не параллельно, так чтобудет выполняться в правильном порядке, даже если createUser имеет значение Async:

Cypress.Commands.add("populateDb", (users) => {
  for (const user in users) {
    cy.createUser(user).then(response => {
      console.log(response)
    })
  }
})

Если вы хотите получить значение возвращаемого значения (в моем случае мне потребуется идентификатор пользователя, чтобы удалить их позже),Вы можете просто сохранить их в var на уровне корня файла и добавить команду Cypress, которая возвращает это значение.

var createdItems = []

Cypress.Commands.add("getCreatedItems", () => {
  return createdItems
})

Cypress.Commands.add("populateDb", (users) => {
  for (const user in users) {
    cy.createUser(user).then(response => {
      createdItems.unshift(response) // I unshift() because I need to delete them in FILO order later
    })
  }
})

Затем в файле теста Cypress вы можете просто вызвать их в том порядке, в котором они вам нужнывыполнить:

cy.populateDb(users)
cy.getCreatedItems().then(response => {
  //response is my createdItems Array, and cy.getCreatedItems() will run only when cy.populateDb() is resolved
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...