Pull to refresh

Comments 5

Мы знали, что моки клиента  не лучшее решение, особенно, если это будет тесно связано с деталями реализации поверх поверх Амплифай, от которых мы хотели избавиться.

А точно под ссылкой "не лучшее решение" - просто гитхаб мокосервисы? Там где-то у них самокритика, прямо в гитхабе?
(не искала пока, из подозрения, что ссылка не та попала)

Подход имеет право на жизнь, но можно сделать гораздо проще и вынести запросы к API в отдельный слой, назовем его ApiClient. Для интеграционных тестов используем TestApiClient с тем-же интерфейсом.

Плюсы:

  • Через год, когда станет модно использовать другие инструменты для тестирования/удаленных вызовов, изменению подвергается только ApiClient

  • Максимально простая реализация

  • Минимум внешних инструментов

Минусы:

  • TestApiClient это фактически упрощенная реализация бекенда, то есть дополнительная работа и потенциальные ошибки / несоответствия

  • Двойная работа, изменения интерфейса ApiClient должны быть продублированы в TestApiClient

  • Если при использовании эмуляции сервера легко замокать какой-то отдельный запрос для отдельного теста, с TestApiClient надо либо реализовать логику внутри, либо городить интерфейс, который позволяет влиять на поведение TestApiClient из кода теста

Я, конечно, предвзят, но попробую разобрать плюсы/минусы предоставленные выше.

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

Через год, когда станет модно использовать другие инструменты для тестирования/удаленных вызовов, изменению подвергается только ApiClient

MSW уже около четырех лет и пока нет даже схожих библиотек по принципу перехвата запросов. Большинство продолжает работать через стабы fetch и других клиентов. Не говоря уже о том, что нет ни одного подобного инструмента позволяющего переиспользовать моки между окружениями.

Не спорю, что рано или поздно найдутся новые подходы, и если библиотека продолжить стоять на месте то естественно канет в лету. Однако судя по постоянному росту в использовании, я бы не рассматривал применение библиотеки через призму времени.

Касательно того, что "изменению подвергается только ApiClient", сам по себе MSW достаточно аккуратно абстрагирован он деталей Вашего приложения. Чего нельзя сказать о любого рода тестовых клиентах—они по определению ближе к слою взаимодействия с API нежели к непосредственно сети. Это подвергает их гораздо более частым изменениям связанными с изменениями подлежащего API в сравнении с MSW.

Максимально простая реализация

Исходя из предыдущего пункта, простота реализации тестового клиента напрямую зависит от реализации самого клиента из-за непосредственной связи между ними. Другими словами: чем сложнее настоящий клиент, тем сложнее будет и его моковая "тестовая" реализация. Как раз здесь MSW и превосходит такие клиенты, поскольку библиотеке все равно как запрашиваются и обрабатываются данные (будь то apiClient.getUser или apiClient.users.getById() через год), реализация моков через данную библиотеку останется идентична, в отличии от тестового клиента.

Минимум внешних инструментов

Это отличный аргумент. В целом, я всегда предпочту внутреннее решение если оно поддерживается. Исходя из моей практики, у компаний нет ресурсов чтобы худо-бедно набросать такое решение, не говоря уже о его достаточном тестировании и поддержке. Если у читателя такие ресурсы имеются—можете избавиться от лишней зависимости. Если нет, то переизобретать велосипед, пожалуй, не самая лучшая идея.

При надлежащем внимании и использовании строгой типизации можно достичь неплохих результатов и с тестовым клиентом. Однако это не уберет основных недостатков в виду его связи с имплементацией, что сказывается на скорости и качестве поддержки таких моков.

Все так, в итоге выбор идет в зависимости от особенностей проекта и предпочтений команды.

Sign up to leave a comment.