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ファイルをコンパクトに保ったまま、環境を切り替えながらテストすることができます。