rspecでモックを使う

apiが絡む部分のテストで、実際にはリクエスト投げて欲しくない部分がありました。

そんな時はモックを使うと便利だと知ったので書いておきます!

 

具体的な状況

HogeBuildJobの中にapiのリクエスト投げてしまう処理がありました。

最初、api投げる処理の直前で

return if Rails.env == test?

と書いてテストでリクエストが投げられないようにしていたのですが、これだとそれ以降の部分がテストで実行できなくなってしまいます。

そのため、テストの中でモックを使い、apiを投げる部分だけ処理を行わないようにしました。

 

 

テストでモック作成した部分

before do ~ endの部分でモックを作成し、特定の部分で使用するように指定しております。

spec/jobs/hoge_build_job_spec.rb

require "rails_helper"

RSpec.describe HogeBuildJob, :type => :job do
include ActiveJob::TestHelper

let(:hoge_build) { FactoryBot.build(:hoge_build) }

describe "export_hugas" do
let!(:huga { FactoryBot.create(:huga) }

before do
# doubleメソッドを使ってhoge_api_mockというモック作成
hoge_api_mock = double('Hoge api')
# 作成したhoge_api_mockモックにpost_hogeメソッド使えるよう設定
allow(hoge_api_mock).to receive(:post_hoge)
# hoge_build_jobというジョブのオフジェクト生成
hoge_build_job = HogeBuildJob.new
# hoge_build_jobがinitialize_hoge_apiメソッドを呼んだ時hoge_api_mockが使われるよう指定
allow(hoge_build_job).to receive(:initialize_hoge_api).and_return(hoge_api_mock)
# ジョブを実行してもモックが使われるためapiは投げられずに済む!!
hogeBuildJob.perform_now(hoge_build)
end

it "export_invoicesに含まれない" do
expect......
end
end
end

 

 

モックを使う事で、実際にリクエスト投げないようにしつつ、api投げた後に行うステータス更新処理は実行させる事ができるようになりました!!!

 

 

感想その他

モックについてなんとなく聞いた事あるという程度だったのですが、実際に使ってみる事ができてよかったです!!

便利でした!!

以下の記事がすごくわかりやすくてとても参考になりました!!!

今回はこちらの記事の基本的な部分のみ参考にさせていただいたのですが、後半部分の発展的な内容についても理解して使いこなせるようになりたいです!!