Написал значит я тесты для patronum/delay. Хочу убедиться, что delay действительно корректный, мол на правильное время откладывает. Прогнал тесты на своем маке и запушил релиз.
И тут всё сломалось.
https://github.com/sergeysova/patronum/runs/619547616?check_suite_focus=trueТесты на ubuntu кричат:
expect(start.diff() > 100).toBe(true)Время delay было меньше 100 миллисекунд.
Думал, я думал. Логгировал, логгировал, да не перевылоггировал.
Оказалось, что в некоторых случаях setTimeout срабатывает
раньше указанного срока, хотя я всегда предполагал, что позже.
Как же тогда писать тесты красиво и удобно. Да так, чтобы время было корректным? Всего лишь нужно ввести так называемую проверку с порогом:
if (received < expected + threshold && received > expected - threshold)И благо, jest позволяет добавить кастомные матчеры, чтобы такие проверки не дублировать в каждом тесте. Результат выглядит так:
expect(start.diff()).toBeCloseWithThreshold(100, 30)— Жест, будь так добр, проверь, что полученное значение, находится в районе 100 миллисекунд, плюс/минус 30мс.
Реализацию можно поглядеть здесь:
https://github.com/sergeysova/patronum/commit/1aa43c48d81b54b8a85099d889e49604a0148ae7