2012-11-09 3 views
35

Wir cachen ID/Pfad-Zuordnung mit Rails.cache in einer Rails 3.2 App. Auf einigen Rechnern funktioniert es OK, aber auf den anderen sind die Werte falsch. Die Ursache ist schwer zu verfolgen, also habe ich einige Fragen über die Rails.cache selbst. Wird es zwischen den Tests gereinigt? Ist es möglich, dass im Entwicklungsmodus zwischengespeicherte Werte im Testmodus verwendet werden? Wenn es nicht gelöscht wird, wie kann ich es tun, bevor ich die Spezifikationen ausführe?wird Rails.cache zwischen den Tests gelöscht?

Mein Cache-Speicher ist Konfiguration ist:

#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

Es gibt 'test' Umgebung für Tests. – ck3g

+0

Ich weiß es, aber ich habe nur diese zwei ganzen für 'config.cache_store'. – mrzasa

Antwort

32

Anzahl:

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

gelöscht den Cache zu haben, bevor jede spec-Datei ausgeführt wird.

Anzahl:

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

den Cache vor jedem spec gelöscht zu haben.

Sie können dies innerhalb spec/spec_helper.rb innerhalb des RSpec.configure Blocks setzen, um es global anwenden zu lassen (empfohlen über Streuung pro Spezifikationsdatei oder Fall).

RSpec löscht diesen Cache standardmäßig nicht automatisch.

+14

Beachten Sie, dass der Cache zwischen den Läufen nicht gelöscht wird, sondern nur zwischen allen Tests innerhalb des umgebenden Bereichs. vorher (: jeder) könnte sein, was du willst. – Woahdae

+0

Danke, aber es ist OK. Falsche Daten wurden außerhalb dieses Bereichs zwischengespeichert. – mrzasa

+2

Wie wäre es mit der Änderung vorher: Jeder tun – baash05

55

Eine effiziente (und einfacher) Methode ist die Testumgebung des Cache einzustellen NullStor zu verwenden:

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

Die NullStor sorgen dafür, dass nichts jemals zwischengespeichert werden.

Zum Beispiel in dem folgenden Code, es wird immer bis zum Block fallen und die aktuelle Zeit zurück:

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

auch die Rails Caching finden Sie im Handbuch: http://guides.rubyonrails.org/caching_with_rails.html#activesupport-cache-nullstore

+27

das einzige Problem mit diesem ist, dass Sie Caching nicht testen können. – baash05

Verwandte Themen