web-dev-qa-db-fra.com

Rails.cache est-il purgé entre les tests?

Nous mettons en cache le mappage id/chemin en utilisant Rails.cache dans une application Rails 3.2. Sur certaines machines, cela fonctionne bien, mais sur les autres, les valeurs sont erronées. La cause est difficile à suivre, j'ai donc des questions sur Rails.cache lui-même. Est-il purgé entre les tests? Est-il possible que les valeurs mises en cache en mode développement soient utilisées en mode test? S'il n'est pas purgé, comment pourrais-je le faire avant d'exécuter les spécifications?

Ma mémoire cache est la configuration:

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

#in: config/environments/production.rb
# config.cache_store = :mem_cache_store
44
mrzasa

Ajouter:

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

pour que le cache soit vidé avant l'exécution de chaque fichier de spécifications.

Ajouter:

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

pour faire vider le cache avant chaque spécification.

Vous pouvez mettre cela à l'intérieur spec/spec_helper.rb dans le RSpec.configure bloquer pour l'appliquer globalement (recommandé plutôt que de le diffuser par fichier ou cas spécifique).

RSpec par défaut n'efface pas ce cache automatiquement.

47
mrzasa

Une méthode plus efficace (et plus simple) consiste à définir le cache de l'environnement de test pour utiliser NullStore:

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

Le NullStore garantit que rien ne sera jamais mis en cache.

Par exemple dans le code ci-dessous, il tombera toujours dans le bloc et retournera l'heure actuelle:

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

Voir également le Rails Caching guide: http://guides.rubyonrails.org/caching_with_Rails.html#activesupport-cache-nullstore

68
jaustin