Нужно объяснение этого специфического странного асинхронного поведения - PullRequest
1 голос
/ 05 февраля 2020

У меня есть тесты e2e для библиотеки javascript, которая работает с элементом canvas. Это организовано следующим образом: есть страница html со списком ссылок, холстом и элементом изображения. Когда я нажимаю на ссылку в библиотеке dr aws, на холсте появляется конкретный контрольный пример и загружается изображение с ожидаемым видом. Также у меня есть скрипт node.js для автоматизации этих действий с помощью webdriverio, похожий на js (библиотека для сравнения изображений) и магнитную ленту (инфраструктура тестирования).

Теперь эта необычная часть (этот пример ниже работает как ожидается, что тесты не пройдены, если изображение отличается от холста и т. д. c.), где я беру все ссылки, сравниваю изображение и холст с похожим js и сохраняю данные (что является результатом сходства js сравнение в массиве), затем я запускаю другой l oop, где я вызываю ленту и проверяю вещи:

const links = await browser.$$('#ul li a');
const testsData = [];
for (const link of links) {
  const data = await compare(link);
  const testName = await link.getText();
  testsData.push([testName, data]);
}

for (const [testName, data] of testsData) {
  tape(testName, t => {
    t.equal(data.rawMisMatchPercentage < 1, true);
    t.end();
  });
}
await browser.deleteSession();

Но если я попытаюсь использовать один l oop, как здесь:

const links = await browser.$$('#ul li a');
let counter = 1;
for (const link of links) {
  console.log('LOOP START ' + counter);
  const data = await compare(link);
  const testName = await link.getText();
  tape(testName, t => {
    console.log('TEST START ' + counter);
    t.equal(data.rawMisMatchPercentage < 1, true);
    t.end();
    console.log('TEST END ' + counter);
  });
  console.log('LOOP END ' + counter++);
}

await browser.deleteSession();

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

  • L OOP START 1 // начались действия на странице, затем было выполнено сравнение и возвращен результат
  • L OOP END 1 // вызвана лента, куда-то положили обратный вызов и вернули
  • L OOP START 2 // начались действия на странице (запросы были отправлены веб-драйверу), что создало свободное время для * 10 67 * сценарий, поэтому обратный вызов из первого вызова ленты может выполнить
  • TEST START 1
  • TEST END 1
  • L OOP END 2
  • L OOP START 3 // по какой-то причине действия на странице больше не позволяют выполнять предыдущие тесты, как это было на L OOP START 2
  • L OOP END 3
  • L OOP START 4 ​​
  • L OOP END 4
  • et c.

И все тесты, кроме теста 1, заканчиваются сообщением: not ok TEST_NUM test exited without ending. Очевидно, сценарий node.js завершается без обратных вызовов ленты (кроме первого).

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

Любая подсказка очень ценится


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

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