2012-11-09 5 views
35

Rails 3.2アプリケーションでRails.cacheを使用してID /パスマッピングをキャッシュします。いくつかのマシンでは正常に動作しますが、他のマシンでは値が間違っています。原因を追跡するのは難しいので、Rails.cache自体についていくつか質問があります。テストの間にパージされますか?開発モードでキャッシュされた値がテストモードで使用される可能性はありますか?パージされていない場合、仕様を実行する前にどうすればよいですか?はRails.cacheがテスト間でパージされていますか?

私のキャッシュストアが設定されている:

#in: config/environments/development.rb 
config.cache_store = :memory_store, {:size => 64.megabytes} 

#in: config/environments/production.rb 
# config.cache_store = :mem_cache_store 
+1

ため 'test'環境がありますテスト。 – ck3g

+0

私はそれを知っていますが、私は 'config.cache_store'のためにこれらの2つのエントリを持っています。 – mrzasa

答えて

32

追加:

before(:all) do 
    Rails.cache.clear 
end 

各specファイルが実行される前にクリアキャッシュを持っています。

追加:

before(:each) do 
    Rails.cache.clear 
end 

各スペック前にクリアキャッシュを持っています。

RSpec.configureブロック内のspec/spec_helper.rbブロック内にこれを配置して、グローバルに適用させることができます(スペックファイルまたはケースごとに分散することより推奨)。

RSpecはデフォルトでそのキャッシュを自動的にクリアしません。

+14

注:実行中にキャッシュをクリアすることはありません。周囲のスコープ内のすべてのテスト間でのみキャッシュをクリアします。前(:それぞれ)があなたの望むものかもしれません。 – Woahdae

+0

ありがとうございます。でも問題ありません。誤ったデータがその範囲外にキャッシュされました。 – mrzasa

+2

これを前に変更する方法:それぞれdo – baash05

55

より効率的な(かつ簡単)メソッドはNullStoreを使用するために、テスト環境のキャッシュを設定することです:

# config/environments/test.rb: 
config.cache_store = :null_store 

NullStoreは何がこれまでにキャッシュされないことを保証します。以下のコードでたとえば

、それは常にブロックに通って落下し、現在の時刻を返します。

Rails.cache.fetch('time') { Time.now } 

はまた、Railsのキャッシュガイドを参照してください。http://guides.rubyonrails.org/caching_with_rails.html#activesupport-cache-nullstore

+27

これは、キャッシングをテストできないという唯一の問題です。 – baash05

関連する問題