Существует множество теорий о том, как тестировать потоки пользователей в приложениях React. Ни одна из этих теорий не является столь великой; так что на практике многие из наших тестов являются по крайней мере одним из тривиальных, иероглифических или сделанных вручную (т.е. вообще не написанных).

#так в чем проблема?

Чтобы протестировать пользовательские сценарии, мы хотим имитировать пользовательское событие для компонента, дождаться обновления состояния, а затем проверить новое состояние.

Однако, если мы напишем наш код в таком порядке (моделирование, затем подписка -> getState), он может зависнуть, потому что к тому времени, когда мы подпишемся, обновление может быть уже выполнено. Итак, достаточно просто, мы подпишемся и ЗАТЕМ смоделируем событие.

Вот пример, написанный с помощью шутки и фермента, адаптированный из [моего] приложения nikfrank/tahini canon TodoList.

Это было не так уж и плохо, на самом деле вы могли бы даже утверждать, что это имеет смысл, если вы можете простить его за то, что он был немного болтливым и интуитивно отсталым.

#uhmReallyWhatsTheProblem

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

Таким образом, весь наш тест выполняется в обратном порядке:
- проверка второго события
- имитация второго события
- проверка первого события, вызов обработчика второго события
- имитация первого события

Если это не спагетти, Италия умрет с голоду.

Давайте воспользуемся промисами, чтобы привести наши тесты в порядок!

С помощью магии функционального программирования мы можем превратить наши тесты во что-то разборчивое!

Вот полный пример из игры tahini canon crib (игра в криббедж).
Тест гарантирует, что игрок не может разыграть две карты в свой ход.

и позже из того же файла этот (который вдохновил эту статью) тест проверяет, что игрок не может сделать нелегальную игру [в сценарии, где он должен играть]:

Таким образом, нам удалось написать тестовый сценарий в том порядке, в котором пользователь действительно будет выполнять действия, и таким образом, чтобы он работал с синхронным и асинхронным кодом. Конечно, это делает написание тестов более разумным, а?