Railsエンジニアの越川です。
よく、テストでRails.cacheを使ったテストをしたいけれども、テストの度に念のため消しておきたいという事情でspec/rails_helper.rbに
config.before(:each) do Rails.cache.clear end
このように書いていたりします。
このRails.cache.clearですが、cacheをdefaultのFileStoreにしていると、tmp/cacheの中身を消すようです。
この時、sassなどを使っているプロジェクトの場合、tmp/cache/assets/配下も一緒に消されてしまいます。これに気づかないとfeature specを実行するたびにsassのコンパイルが走ってしまい何故かfeature specがべらぼうに遅い!という自体が起きてしまいます。本格的にsassを使っているほど顕著です。
実際、poltergeistをDriverに設定したfeature specが極端に遅いケースが有り、試しにレイアウトファイルからstylesheet_link_tagを消してみたところ、高速に実行できるようになったことから、cssのレンダリング、もしくはsassのコンパイルに時間がかかることを突き止めました。
簡単な解決策は、test時のcacheをmemoryに変えることです。config/environments/test.rbを修正しましょう。
Rails.application.configure do config.cache_store = :memory_store end
こうすることで、Rails.cache.clearの対象がtmp/cacheではなくなるので、tmp/cache/assets/が消えなくなります。
マネーフォワードでは日々テストを改善していきたいエンジニアを募集しています。 みなさまのご応募お待ちしております!