Как повторить действия в кипарисе и получить результат каждого действия - PullRequest
1 голос
/ 17 февраля 2020

Я пытаюсь повторить определенное действие в кипарисе, определенное в doTheAction, а затем получить результаты этих повторных действий. Когда я пытаюсь выполнить Promise.all, он немедленно преобразуется в массив неопределенных

describe("some test", () => {
  it("for each", () => {
    const data = { a: 1, b: 2 };
    Promise.all(
      Object.entries(data.en).map(([key, value]) =>
        doTheAction(value).then(result => [key, result])
      )
    ).then(result => {
      debugger;
      // array of undefined before the browser did anything
      console.log(result);
    });
  });
});
const doTheAction = text => {
  cy.visit(
    "https://my.site"
  );
  cy.get("some input").type(text);
  return cy
    .get("the result")
    .then(result => result[0].innerText);
};

Когда я пытаюсь объединить в цепочку действия, я получаю неопределенные результаты, когда второе действие завершено:

describe("some test", () => {
  it("for each", () => {
    const data = { a: 1, b: 2 };
    Object.entries(data).reduce(
      (results, [key, value]) =>
        results.then(results =>
          doTheAction(value).then(
            result =>
              //results is undefined after the second action
              results.concat([[key, result]]) //current result
          )
        ),
      Promise.resolve([]) //initial results
    );
  }).then(results => {
    //never gets here
    console.log(results);
  });
});
const doTheAction = text => {
  cy.visit("https://my.site");
  cy.get("some input").type(text);
  return cy
    .get("the result")
    .then(result => result[0].innerText);
};

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

1 Ответ

1 голос
/ 17 февраля 2020

Тесты, управляемые данными, довольно просты, один обобщенный шаблон -

const arrayOfTestData = [...];
const arrayOfExpectedResults = [...];  

const functionContainingSingleTest = (dataItem, index) => {

  // Commands that use dataItem, and check arrayOfExpectedResults[index]

}

arrayOfTestData.forEach((dataItem, index) => 
  functionContainingSingleTest(dataItem, index)
);
// After loop, reached before commands finish.

Что происходит, когда ваша очередь тестов находится в командах внутри функции, как если бы вы написали их последовательно.


Если вы хотите собрать результаты, это становится более сложным, поскольку команды не возвращают пригодное для использования значение. Вы можете попробовать связать .then(result => results.push(result)), но проблема в том, что любой код, внешний по отношению к l oop, который использует массив результатов, скорее всего, запустит до того, как последовательность команд завершится.

Один из способов - установить псевдоним Cypress на конце l oop и дождаться его.

Проверка

describe('Data-driven tests', () => {

  it('should wait for results', () => {

    const arrayOfTestData = [1,2,3];
    const results = [];

    const functionContainingSingleTest = (dataItem, index) => {

      cy.visit('app/data-driven.html');
      cy.get('input').type(dataItem);

      cy.get('input').invoke('val')
        .then(result => {
          results.push(result[0]);
        });

      if (index === arrayOfTestData.length -1) {
        // Note, the following line executes before all tests finish, 
        // but is just queueing a command, which will run after
        // all the tests have completed
        cy.wrap(true).as('done');  
      }
    }

    arrayOfTestData.forEach((dataItem, index) => 
      functionContainingSingleTest(dataItem, index)
    );

    // After loop, reached before commands finish.
    console.log(results);  // outputs []

    // Wait for the signal 
    cy.get('@done').then(_ => {
      console.log(results);  // outputs ["1", "2", "3"]
    });

  })
})

приложение / управляемый данными. html

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