カクカクしかじか

技術的なアレコレ

RSpecのshared_contextで共通処理を1ヶ所にまとめる

はじめに

RSpecにはテストで毎回同じ処理を書かなくても良いように処理を共通化する shared_context という仕組みがあります。
自分は直近まで知らなかったので、個人的なメモとして投稿します。

注記

サンプルコードは適当に用意したコードなので実在のコードではありません。

やりたいこと

毎回ログイン認証チェックをテストのブロック毎に記載したくないので共通化

やり方

shared_context "キーワード" で処理を共通化
呼び出したいところで include_context "キーワード" で呼び出す!

サンプルコード

# shared_contextでテストのための前処理を共通化する
# この場合 "ログイン状態のUserがアクセスする" がキーワードになる
shared_context 'ログイン状態のUserがアクセスする' do
  before do
    allow(controller).to receive(:authenticated?).with(:user).and_return(true)
  end
end

# 実際のテストブロック
describe 'orders#create' do
  let!(:params) { { # 適当な値 } }
  context 'ログインして購入する' do
    include_context 'ログイン状態のUserがアクセスする'

    it '正常に購入商品データが作成される' do
      # テストしたい処理
    end
  end
end

終わりに

テストが多くなってくると同じような記述が増えてくると思います。
こうした共通化の方法を知っておくとテストコードも見通しもよくなっていいですね。