CarrierWave + RSpec ディレクトリ問題

こんにちは。麺処まつば副店長です。

今回も引き続き git のブランチ周りの記事でも書こうと思ったのですが
うまい例が降りて来ず…一旦CarrierWaveに逃げました。

そんな訳で、今回はCarrierWave関連のrspecを実行する際の
落とし穴についてでも書いてみようと思います。

CarrierWave系関連のテストを実行する場合、特に何も指定していないと
1)デフォルトのディレクトリにファイル保存される
2)ファイルがひたすら溜まっていく
という状況になります。

この1)実はクセモノで、確か development 環境でも特に指定がないと
同じディレクトリにファイルを保存してしまうのです。
なので今回は、以前コレ↓をやったときのことでも書いてみます。
a)rspecで保存されるファイルのディレクトリを指定
b)テスト終了後にファイルを削除する

やったことは下記にある通りなんですが、自分用メモということで
https://github.com/carrierwaveuploader/carrierwave/wiki/How-to%3A-Cleanup-after-your-Rspec-tests


spec/spec_helper.rb

RSpec.configure do |config|
  …略…
  #「b)テスト終了後にファイルを削除する」のための記述
  config.after(:all) do
    if Rails.env.test?
      FileUtils.rm_rf(Dir["#{Rails.root}/spec/support/uploads"])
    end
  end
end

#「a)rspecで保存されるファイルのディレクトリを指定」のための記述
if defined?(CarrierWave)
  CarrierWave::Uploader::Base.descendants.each do |klass|
    next if klass.anonymous?
    klass.class_eval do
      def cache_dir
        "#{Rails.root}/spec/support/uploads/tmp"
      end 
               
      def store_dir
        "#{Rails.root}/spec/support/uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
      end 
    end
  end
end

a)rspecで保存されるファイルのディレクトリを指定
コレに該当するのが下の方の「if defined?(CarrierWave)」からの記述。
chache_dir と store_dir それぞれをオーバライドし、保存用のディレクトリを変更しています。
ディレクトリは適宜変更すると良いと思います。

Uploader が1つなのであれば
その Uploader 内でオーバーライドしちゃえばいいと思うのですが
副店長の環境では Uploader が沢山あったので、spec_helperで指定しています。

b)テスト終了後にファイルを削除する
RSpec.configure」中の「config.after(:all)」の記述で
テスト終了後に rspec 実行中に保存された画像をディレクトリごとごっそり削除しています。
当然ですが、削除するディレクトリはa)で指定したディレクトリです。


見落としがちなんですが CarrierWave の Wiki って結構大事な事かいてあるんですよね…
https://github.com/carrierwaveuploader/carrierwave/wiki

次回は、環境毎に保存先ディレクトリを変更した時の話でも書こうと思います。