Как повторить, обведите XHR-запросы, обработайте несколько XHR-запросов в Cypress - PullRequest
0 голосов
/ 21 февраля 2020

Как сделать через интервал запросы перед тестами? Я попробовал 2 способа повторить запросы, но ни один из них не удался;

Мне нужно загрузить файл, ожидая, пока он не будет успешно импортирован

На первом шаге я загружаю файл на свой сервер в Cypress

    before( ()=> {
      //my custom POST command
      cy.form_request(url, data)
        .then(({id}) => {

Затем я жду идентификатор загруженного файла

          check_It_Till_Success_It(id);
        })
    })

Затем полученный идентификатор я передаю в новый запрос, чтобы проверить его статус на сервере и необходимо повторить запрос пока обработка файла не закончена. В приведенном ниже решении написано

CypressError: cy.wait () принимает псевдонимы только для маршрутов. Псевдоним: 'check_it_request' не соответствует маршруту.

  function check_It_Till_Success_It(id) {

    function checkRequest() {
      cy.request("GET", "http://localhost:28080/admin/api/catalog/import/status/" + id)
        .then(({status}) => {
          if (status === "FINISHED" || status === "FAILED") {
            clearInterval(check_It);
          } else {
            console.log('retry one more time');
          }
        }).as('check_it_request');
      cy.wait("@check_it_request");
    }

    checkRequest();

    const check_It =  setInterval(checkRequest, 1000);
  }

или вот еще одно мое решение с помощью рекурсивного запроса:

  function check_It_Till_Success_It(id) {

    return (
      cy.request("GET", BASE_URL + "/admin/api/catalog/import/status/" + id)
        .then(({status}) => {
          if (status === "FINISHED" || status === "FAILED") {
            console.log('success');
          } else {
            console.log('retry one more time');
            setTimeout(() => check_It_Till_Success_It(id), 1000)
          }
        })
    )
  }

, но выдает ошибка:

Uncaught CypressError: Cypress обнаружил, что вы вернули обещание из команды, одновременно вызывая одну или несколько команд cy в этом обещании.

Что я делаю не так?

1 Ответ

0 голосов
/ 22 февраля 2020

Я нашел свою ошибку из-за использования нативных инструментов JS как setTimeout , setInterval .

Cypress не позволяет использовать их и заменяет контролируемыми методами: cy.clock и cy.tick

Итак, я взял реализацию рекурсии и заменил ее методами, приведенными выше, и мой код стал:


  function check_It_Till_Success_It(id) {
    cy.request("GET", BASE_URL + "/admin/api/catalog/import/status/" + id)
      .then(resp => {
        const status = resp.body.status;

        if (status === "FINISHED" || status === "FAILED") {
          console.log('success');

        } else {
          console.log('retry one more time');
          cy.clock();
          cy.tick(1000);
          check_It_Till_Success_It(id)
        }
      })
  }

Offtopi c note : I Я новичок в Cypress, и, как я понял, он заменяет большинство собственных функций js, поэтому необходимо посмотреть документы намного ближе (BIN GO!) или посмотреть раздел выпуска , потому что некоторые JS специфицировано c функция просто cra * sh Cypress без каких-либо уведомлений или перехваченная ошибка , например: объект FormData сбился метод запроса Cypress.

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