はじめに
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
終わりに
テストが多くなってくると同じような記述が増えてくると思います。
こうした共通化の方法を知っておくとテストコードも見通しもよくなっていいですね。