Cypress запрос с повторной попытки - PullRequest
0 голосов
/ 07 января 2019

В тесте на кипарис мне нужно проверить действие, вызвав внешний API. Вызов API всегда будет возвращать результаты (от некоторого предыдущего запуска), поэтому я не могу просто вызвать один раз и проверить результат. Мне нужно повторить несколько раз, пока я не найду совпадение для текущего прогона с общим временем ожидания / сбоя. Количество времени, необходимое для получения текущего результата, сильно варьируется; Я не могу просто долго ждать безумного ожидания перед этим звонком.
Смотрите комментарии во фрагменте ниже; как только я пытаюсь выполнить запрос в цикле, он никогда не вызывается. Я получил тот же результат, используя cy.wait. Также я не могу обернуть фактический запрос в другую функцию, которая возвращает Cypress.Promise или аналогичную, которая просто выдвигает проблему на один кадр стека.

Cypress.Commands.add("verifyExternalAction", (someComparisonValue) => { 

    const options = {
      "url": some_url,
      "auth": { "bearer": some_apikey },
      "headers": { "Accept": "application/json" }
    };

    //// This works fine; we hit the assertion inside then.
    cy.request(options).then((resp) => {
      assert.isTrue(resp.something > someComparisonValue);
    });

    //// We never enter then.
    let retry = 0;
    let foundMatch = false;
    while ((retry < 1) && (!foundMatch)) {
      cy.wait(10000);
      retry++;
      cy.request(options).then((resp) => {
        if (resp.something > someComparisonValue) {
          foundMatch = true;
        }
      });
    }
    assert.isTrue(foundMatch);

});

1 Ответ

0 голосов
/ 07 января 2019
  1. Нельзя смешивать синхронизацию (while loop; assert.isTrue вне команд cy ...) и асинхронную работу (команды cy). Прочитайте Введение в Cypress # Команды-цепочки
  2. Ваш первый запрос подтверждает значение resp.something, и если он не выполняется, вся команда завершается неудачей, поэтому больше не повторяется.
  3. Вы выполняете асинхронную работу, и вы не можете await команды кипариса (чего вы вообще не делали), поэтому вам нужна рекурсия , а не итерация . Другими словами, вы не можете использовать while петля.

Что-то вроде этого должно работать:

Cypress.Commands.add("verifyExternalAction", (someComparisonValue) => {

    const options = {
        "url": some_url,
        "auth": { "bearer": some_apikey },
        "headers": { "Accept": "application/json" }
    };

    let retries = -1;

    function makeRequest () {
        retries++;
        return cy.request(options)
            .then( resp => {
                try {
                    expect( resp.body ).to.be.gt( someComparisonValue );
                } catch ( err ) {

                    if ( retries > 5 ) throw new Error(`retried too many times (${--retries})`)
                    return makeRequest();
                }
                return resp;
            });
    }

    return makeRequest();
});

Если вы не хотите, чтобы Cypress регистрировал все неудавшиеся ожидания во время повторных попыток, не используйте expect / assert, который выбрасывает, и делайте регулярное сравнение (и, возможно, утверждайте только в конце в .then обратный вызов, связанный с последним makeRequest() вызовом).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...