Выбор ответа Middle Тесты, бенчмарки и модули спрашивают часто обновлено

Как мокать зависимости в Go

Вопрос

Сервис ходит в платёжный API через структуру *PayClient. Как сделать его тестируемым?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Объявить в сервисе маленький интерфейс, в тесте дать фейк. Неявные интерфейсы позволяют потребителю объявить ровно то, что ему нужно, и подставить фейк или мок (руками или mockgen).

Варианты ответа

  1. Подменить метод PayClient через monkey patching, это стандарт Go
  2. Создать глобальную переменную с клиентом и менять её в тестах
  3. Тестировать только с настоящим API в песочнице провайдера
  4. Объявить в сервисе маленький интерфейс, в тесте дать фейкправильный ответ

Разбор

Неявные интерфейсы позволяют потребителю объявить ровно то, что ему нужно, и подставить фейк или мок (руками или mockgen). Monkey patching в Go не идиоматичен и требует unsafe-трюков. Глобальные переменные ломают параллельные тесты. Настоящий API для юнит-тестов медленный и ненадёжный, его оставляют для интеграционных тестов или httptest.NewServer.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.