rspecで事前・事後の環境設定を切り替える

rspecでテストする際、事前・事後の処理はbefore/afterブロックで書きますが、よりグローバルな環境設定など、複数のdescribeで環境切り替えを共有したいときがあります。

今回は、「キャッシュストアをmemcachedにした場合」「キャッシュストアをfileにした場合」を切り替える例です。
※単体テストの切り分け上、必ずしも適切な例ではないかもしれませんが、実際のところActionCacheはCacheStoreによって微妙に動作が変わるので、この辺テストしたいことも多いのです

spec/support以下でこのような準備をしておきます。

# spec/support/cache_store.rb
RSpec.configure do |config|
  config.around(:each) do |example|
    if store = example.metadata(:caching)
      old_caching = ActionController::Base.perform_caching
      ActionController::Base.perform_caching = true
      ActionController::Base.cache_store = store
      example.run
      Rails.cache.clear rescue nil
      ActionController::Base.perform_caching = old_caching
    else
      example.run # 一般のexampleはすべてここを通る
    end
  end
end

あとは各specで、

describe "キャッシュをmemcachedに", :caching => :mem_cache_store do
  it "ほげほげ" do
  end
end
describe "キャッシュをfileに", :caching => :file_store do
  it "ほげほげ" do
  end
end

のようにできます。

大きなaround filterですね。
この手法を使うと、specファイルをコンパクトに保ったまま、環境を切り替えながらテストすることができます。

Ruby on RailsによるWEBシステム開発、Android/iPhoneアプリ開発、電子書籍配信のことならお任せください この記事を書いた人と働こう! Ruby on Rails の開発なら実績豊富なBPS

この記事の著者

baba

ゆとりプログラマー。 高校時代から趣味でプログラミングを初め、そのままコードを書き続けて現在に至る。慶應義塾大学環境情報学部(SFC)卒業。BPS設立初期に在学中から参加している最古参メンバーの一人。得意分野はWeb全般、Ruby on Rails、Androidアプリケーションなど。最近はBlinkと格闘中。軽度の資格マニアで、情報処理技術者試験(高度10区分)などを保有。

babaの書いた記事

週刊Railsウォッチ

インフラ

Rubyスタイルガイドを読む

BigBinary記事より

ActiveSupport探訪シリーズ