Практическое руководство по тестированию вашей платежной интеграции

Настройте отдельную дополнительную учетную запись для автоматического тестирования на панели инструментов Stripe

Для своих проектов я обычно создаю как минимум три отдельных суб-учетных записи Stripe: одну для разработки (для тестирования вручную), одну для тестирования (автоматические тесты) и одну для производства.

После создания этих дополнительных учетных записей сохраните их учетные данные API в своей среде (.bashrc для Linux и .bash_profile для Mac).

Я установил свой инициализатор Stripe в Rails следующим образом (config/initializers/stripe.rb):

Таким образом, я точно знаю, что разные среды не будут конфликтовать друг с другом.

Определите зацепки до и после тестов

Два метода, определенные в spec/support/clear_stripe.rb, будут выполняться между тестовыми наборами и после них, чтобы гарантировать, что каждый тестовый запуск будет изолированным и против чистого листа на стороне Stripe.

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

Имитация полосы там, где это имеет смысл

Выполнение оперативных запросов к Stripe в наборе тестов может дать вам больше уверенности в вашем приложении, но это может занять очень много времени по мере роста вашего приложения. Чтобы этого избежать, я использую жемчужину под названием stripe-ruby-mock:

Вызывая StripeMock.start перед каждым тестом, мы гарантируем, что наш набор тестов не будет делать запросы к Stripe в реальном времени. Я выбрал имитацию Stripe для действия Stripe::Customer.create, потому что он часто вызывается, и ответ, который я ищу, вряд ли изменится на стороне Stripe.

Пример интеграционного теста

В этом интеграционном тесте проверяется часть моего приложения, которая позволяет пользователю предоставлять телефонные номера из Twilio. Цель теста - убедиться, что Stripe может настроить подписку для пользователя и попытаться выставить счет за первый период подписки.

Здесь мы видим, что мы не вызываем stripe-ruby-mock. Вместо этого мы делаем запросы к Stripe в реальном времени. Как обычно, перед запуском набора тестов данные Stripe очищаются, и мы инициализируем пользователя в нашей системе и соответствующую запись клиента на стороне Stripe.

В теле теста для покупателя добавляется источник оплаты (это поведение тестируется в отдельном наборе тестов) и делается веб-запрос. После этого утверждается поведение приложения.

Проверка веб-перехватчиков, исходящих из службы Stripe

Ваше приложение должно включать логику для проверки того, что веб-запросы, поступающие на ваш сервер, действительно исходят из Stripe. В противном случае кто угодно может отправлять фальшивые запросы в вашу службу, чтобы обойти логику выставления счетов.

Я написал модуль выше для проверки запросов, исходящих от Stripe, и подключил его к своему контроллеру в before_action:

Тест для этого контроллера прост. При тестировании мы должны получить unauthorized ответ, потому что запрос не подписан Stripe:

Тестирование Stripe Webhooks

Чтобы упростить тестирование, я создал модуль в своем приложении и делегировал бизнес-логику, которая вызывается событиями Stripe.

Модуль используется для извлечения полезной нагрузки, предоставляемой Stripe, и условного запуска бизнес-логики в зависимости от типа события. Таким образом, я могу использовать stripe-ruby-mock для создания фиктивных запросов, передачи этих запросов модулю и наблюдения за его поведением. Набор тестов для тестирования веб-перехватчиков выглядит так:

В каждом из тестов мы передаем параметры конфигурации запроса в stripe-ruby-mock и передаем событие, испущенное гемом, в StripeHelper::IncomingWebhook. Затем модуль подключается к моделям приложения и выполняет определенные действия, которые мы можем наблюдать после этого.

На этом пока все! Надеюсь, это вдохновило вас на написание тестов для интеграции Stripe в ваше приложение.

Шашике - инженер-программист из Торонто и основатель Restarone Inc.. Когда он не занимается разработкой программного обеспечения, он создает контент на Medium и YouTube, чтобы помочь людям перейти в технологический процесс.