2012-11-09 12 views
35

Abbiamo cache id/path mapping utilizzando Rails.cache in un'applicazione Rails 3.2. Su alcune macchine funziona bene, ma sugli altri i valori sono sbagliati. La causa è difficile da rintracciare quindi ho alcune domande sullo Rails.cache stesso. Viene epurato tra i test? È possibile che i valori memorizzati nella cache nella modalità di sviluppo siano utilizzati in modalità test? Se non è stato eliminato, come potrei farlo prima di eseguire le specifiche?è stato rimosso da Rails.cache tra i test?

Il mio negozio di cache è di configurazione è:

#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

C'è 'test' per test. – ck3g

+0

Lo so, ma ho solo queste due entrate per 'config.cache_store'. – mrzasa

risposta

32

Add:

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

di avere eliminato la cache prima di ogni specifica file viene eseguito.

Add:

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

di avere eliminato la cache prima di ogni spec.

È possibile inserire questo spec/spec_helper.rb all'interno del blocco RSpec.configure per applicarlo globalmente (consigliato in caso di diffusione per file o caso specifico).

RSpec per impostazione predefinita non cancella automaticamente la cache.

+14

nota, che non cancellerà la cache tra le esecuzioni, solo tra tutti i test all'interno dello scope circostante. prima (: ciascuno) potrebbe essere quello che vuoi. – Woahdae

+0

Grazie, ma va bene. I dati errati sono stati memorizzati nella cache al di fuori di tale ambito. – mrzasa

+2

come cambiarlo in precedenza: ognuno fa – baash05

55

Un metodo più efficiente (e più facile) è quello di impostare la cache del ambiente di test da usare NullStore:

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

Il NullStore assicura che nulla potrà mai essere memorizzate nella cache.

Ad esempio, nel codice qui sotto, sarà sempre cadere attraverso il blocco e restituire l'ora attuale:

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

vedere anche la guida Rails Caching: http://guides.rubyonrails.org/caching_with_rails.html#activesupport-cache-nullstore

+27

l'unico problema è che non è possibile testare la memorizzazione nella cache. – baash05

Problemi correlati