Рубрики
Без рубрики

Как заметить Async Trap в тестах

Async сложно. Особенно в тестах. Несмотря на то, что код, используемый в этом посте, является конкретным Emberjs, … Теги с JavaScript, Ember, тестированием.

Async сложно. Особенно в тестах.

Хотя код, используемый в этом посте Emberjs Специфические, методы применяются к любому тестовым коде.

Некоторые определения

Ember имеет очень удобный способ убедиться, что все асинхронистые события будут завершены перед продвижением к следующему шагу. Это называется Ember RunLoop Отказ Так что это просто вопрос положения ждать перед тем, как ваше вручную произошло событие.

Но для кода, который живет за пределами runloop (библиотеки анимации, 3-я сторонние сценарии, CSS-переходы, …) У нас есть активный официант waituntil () Это часть Эмбер-Тестовые помощники . В основном то, что это делает, так это то, что он регулярно выполняет заданный обратный вызов, пока обратный вызов не возвращается. Пример:

console.log('Starting journey');

waitUntil(() => donkey.areWeThereYet(), {timeout: 10000});

console.log('Finished journey');

Эта проблема

await searchButton.click();
assert.equal(searchButton.isDisabled, true, 'button is disabled after search request execution');

await waitUntil(() => resultsTable.hasSomeData);
assert.equal(searchButton.isDisabled, false, 'button is enabled after search finished');

Проблема с этим невинным просмотром тестового кода заключается в том, что по своей природе имеет скрытое состояние гонки. Ошибка в первом Assert () Звоните, потому что это может быть выполнено после Поиск закончил.

Простой способ узнать, что такая ошибка – применить следующее правило:

Любое активное ожидание снаружи runloop должен быть перемещен до ближайшего ждать Отказ

Применение этого правила к нашему коду мы получим:

await searchButton.click();
await waitUntil(() => resultsTable.hasSomeData);

assert.equal(searchButton.isDisabled, true, 'button is disabled after search request execution');
assert.equal(searchButton.isDisabled, false, 'button is enabled after search finished');

И из этого можно легко увидеть, что в моей тестировании есть ошибка. Не может утверждать два противоположных значения для searchbutton.isdisabled сразу после того, как друг друга.

Решение

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

Никогда не кладите Assert () заявления между последними ждать и ваш Активный официант Отказ

Оригинал: “https://dev.to/michalbryxi/how-to-spot-async-trap-in-tests-493f”