rspec で Faraday の stub を使う
Ruby Ruby on Rails
Published: 2019-06-07

やったこと

Faraday の stub を利用して rspec でテストを書いてみます。

確認環境

$ ruby --version
ruby 2.6.3p62 (2019-04-16 revision 67580) [x86_64-darwin17]

$ rails --version
Rails 5.2.3

$ gem list | grep rspec-rails
rspec-rails (3.8.2)

$ gem list | grep faraday
faraday (0.15.4)

調査

spec/models/task4_spec.rb

require 'rails_helper'

RSpec.describe Task, type: :model do

  it 'test1 allow success' do
    conn = Faraday.new do |conn|
      conn.adapter :test, Faraday::Adapter::Test::Stubs.new do |stub|
        stub.get '/fuga/test.json' do
          [200, {}, JSON.generate({a: 'hogehoge'})]
        end
      end
    end

    response = conn.get '/fuga/test.json'
    p response.body
  end
end

出力結果

$ bundle exec rspec spec/models/task4_spec.rb
"{\"a\":\"hogehoge\"}"
.

Finished in 0.00817 seconds (files took 2.74 seconds to load)
1 example, 0 failures

所感

こんな感じでレスポンスを差し替えることができます。

メリット

外部サービスのAPIのテストなどがやりやすくなりそうです。

デメリット

外部サービスのAPIのレスポンスが変わってもテストでは気づきにくくなりそうです。

レスポンスが変わったことについて、テストを実行しないと気付かないという体制の方が問題だと思うので、デメリットはあまり気にしなくても良いかもしれません。

参考