freks blog

about

stripe-ruby-mock gemを読んでみた

stripe-ruby-mock/stripe-ruby-mock: A mocking library for testing stripe ruby を読んでみました

stripe gem を mock してあげて、実際の Stripe にアクセスせずテストしやすくする gem です

読み方は Ruby gem の読み方 にまとめてます

まずは README.md をざっと読 む
stripe-ruby-mock.gemspec を見て、依存している gem を確認
gem のソースコードのディレクトリ構造やファイルをざっと見て把握

README に戻って、一番最初に StripeMock.start を呼んでるようなので該当するソースコードを探します
grep して探しました

stripe-ruby-mock/instance.rb at v3.1.0 · stripe-ruby-mock/stripe-ruby-mock

module StripeMock
  # 省略
  def self.start
    return false if @state == 'live'
    @instance = instance = Instance.new
    Stripe::StripeClient.send(:define_method, :execute_request) { |*args, **keyword_args| instance.mock_request(*args, **keyword_args) }
    @state = 'local'
  end

Stripe::StripeClient.send で stripe-ruby gem のメソッド呼び出しを乗っ取っているようです

StripeMock.Instance を呼び出しているので、そのファイルを読みます
lib/stripe_mock/instance.rb

これに処理が色々書かれているのがわかります

include StripeMock::RequestHandlers::Cards などたくさん読んでて、\lib\stripe_mock\request_handlers\* に stripe-ruby の代わりになる処理を書いているようです

何ができるかざっと知りたいときは、テストコードを読むのも参考になります

Stripe Refunds で payment intent での処理がなかったので PR 送りたかったのですが、すでにありました
Adds some basic call/response mocking of refunds for payment intents by hammerdr · Pull Request #732 · stripe-ruby-mock/stripe-ruby-mock

取り込まれてほしいんですが、README にあるように手が足りないそうです