WebMock, VCR или св...
 
Уведомления
Очистить всё

WebMock, VCR или свой фейковый клиент для тестов платёжного API?

5 Сообщения
5 Пользователи
2 Реакции
370 Просмотры
GalinaKorneva
Сообщения: 30
Автор темы
Читает чужие PR бэкенд-разработчица
Присоединился: 4 года назад
[#26]

Тесты на интеграцию с платёжкой у нас на VCR. Кассет уже больше сотни, половина записана год назад, и когда провайдер поменял формат ответа, тесты остались зелёными, а прод упал на вебхуке. Думаю переходить на WebMock с явными заглушками, чтобы ответ был виден прямо в тесте:

stub_request(:post, %r{/v2/charges\z})
  .with(body: hash_including(amount: 125000, currency: "RUB"))
  .to_return(
    status: 200,
    headers: { "Content-Type" => "application/json" },
    body: { id: "ch_1", status: "succeeded" }.to_json
  )

Но так в каждом тесте по десять строк заглушек, а сценариев у нас под сорок. Как у вас устроено?


4 ответа
Ксения 90
Сообщения: 18
Пишет тесты QA-автоматизатор
Присоединился: 4 года назад

Кассеты стареют у всех, это свойство VCR, а не ваша ошибка. У него есть re_record_interval: ставите, например, 30 дней, и кассета перезаписывается при следующем прогоне, если есть доступ к песочнице провайдера. Изменившиеся кассеты потом смотрит человек в PR. Но если песочница нестабильная или её нет вовсе, WebMock честнее.


Ответ
kostya.sokurov
Сообщения: 73
Держит прод бэкенд-разработчик, senior
Присоединился: 4 года назад

Я бы вообще не мокал HTTP в тестах бизнес-логики. Делается тонкий клиент к платёжке с двумя-тремя методами и рядом фейк с тем же интерфейсом. Бизнес-логика тестируется с фейком, а сам клиент отдельно, несколькими тестами на WebMock, где и проверяется формат запросов и ответов.

class FakePaymentClient
  attr_reader :charges

  def initialize
    @charges = []
  end

  def charge(amount:, currency:, idempotency_key:)
    @charges << { amount:, currency:, idempotency_key: }
    { "id" => "ch_#{@charges.size}", "status" => "succeeded" }
  end
end

Подменяется через конфиг или аргумент конструктора, и десять строк заглушек превращаются в expect(client.charges.size).to eq(1). Сверять формат с реальным провайдером всё равно надо, но это уже пара тестов на клиент, а не сорок сценариев.


Ответ
1 ответ
yarik_1966
Присоединился: 3 года назад

Пишет в irb разработчик
Сообщения: 3

с фейком ещё ошибки провайдера легко изображать: метод кидает нужное исключение, и всё


Ответ
alisher1996
Сообщения: 6
Пишет в irb архитектор
Присоединился: 3 года назад

Фейк хорош, пока не начинает расходиться с настоящим клиентом. Видел, как в фейке метод принимал amount, а настоящий уже amount_cents, и тесты месяц были зелёные. Если идти этим путём, один и тот же набор контрактных тестов надо гонять и на фейке, и на настоящем клиенте с WebMock.


Ответ