Tech Racho エンジニアの「?」を「!」に。
  • 開発

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


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。