Практическое руководство по тестированию вашей платежной интеграции
Настройте отдельную дополнительную учетную запись для автоматического тестирования на панели инструментов 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, чтобы помочь людям перейти в технологический процесс.