unitarias pruebas k10 como celular cache borrar ruby-on-rails ruby-on-rails-3 testing caching

ruby-on-rails - pruebas - como borrar el cache de mi celular lg



Opcionalmente, prueba el almacenamiento en caché en las pruebas funcionales de Rails 3. (5)

En general, quiero que mis pruebas funcionales no realicen acciones de almacenamiento en caché. Rails parece estar de mi lado, de forma config.action_controller.perform_caching = false en environment/test.rb Esto conduce a pruebas funcionales normales que no prueban el almacenamiento en caché.

Entonces, ¿cómo puedo probar el almacenamiento en caché en Rails 3.

Las soluciones propuestas en este hilo parecen más bien complicadas o orientadas hacia Rails 2: ¿Cómo habilitar el almacenamiento en caché de páginas en una prueba funcional en rails?

Quiero hacer algo como:

test "caching of index method" do with_caching do get :index assert_template ''index'' get :index assert_template '''' end end

Tal vez también hay una mejor manera de probar que el caché fue golpeado?


Aquí está mi solución actual al problema: En environment/test.rb establecí

config.action_controller.perform_caching = true

Además, estoy mono parcheando Test::Unit::TestCase como sigue:

class Test::Unit::TestCase def setup_with_disable_caching setup_without_disable_caching disable_caching end alias_method_chain :setup, :disable_caching def disable_caching ActionController::Base.perform_caching = false end def enable_caching(&blk) ActionController::Base.perform_caching = true if blk yield disable_caching end end end

Esto me permite escribir las siguientes pruebas:

test "info about caching (with caching)" do enable_caching do get :about, :locale => :en assert_template ''about'' get :about, :locale => :en assert_template nil end end test "info about caching (without caching)" do get :about, :locale => :en assert_template ''about'' get :about, :locale => :en assert_template ''about'' end

No es perfecto, pero funciona por ahora. Todavía estoy interesado en mejores ideas !!


Es probable que termines con las pruebas pisando el uno al otro. Debería envolver esto con asegurar y restablecerlo a los valores antiguos adecuadamente. Un ejemplo:

module ActionController::Testing::Caching def with_caching(on = true) caching = ActionController::Base.perform_caching ActionController::Base.perform_caching = on yield ensure ActionController::Base.perform_caching = caching end def without_caching(&block) with_caching(false, &block) end end

También he puesto esto en un módulo para que pueda incluirlo en su clase de prueba o clase de padre.


Esto no es una respuesta, sino algunas limitaciones a tener en cuenta que no encajan en un comentario.

  • Todas las respuestas (sorprendentes) que se basan en ActionController::Base.perform_caching no funcionarán para el almacenamiento en caché de bajo nivel (consulte esta respuesta ). La única opción que tiene es la configuración del módulo config.cache_store independiente que estableció en :null_store .

  • Como @ viktor-trón dijo anteriormente, configurar el cache_store no es posible entre pruebas, solo en init.

  • El caché se comparte entre los entornos para el cache_store predeterminado. Como resultado, (i) la memoria caché debe borrarse antes de realizar pruebas si le temen cosas de su sesión de desarrollo, (ii) las pruebas en ejecución borran la memoria caché de sus otros entornos. Sin embargo, su entorno de producción debería usar algo como mem_cache_store o cualquier otra opción más adecuada para él, por lo que debería estar bien.

Desde los dos primeros puntos, parece que las pruebas para el almacenamiento en caché de bajo nivel no es posible por ejemplo.


Mi versión que funciona:

RSpec.configure do |config| config.around(:each) do |example| caching = ActionController::Base.perform_caching ActionController::Base.perform_caching = example.metadata[:caching] example.run Rails.cache.clear ActionController::Base.perform_caching = caching end end

Crédito a Rossti, pero

  1. El caché necesita ser borrado entre ejemplos
  2. La tienda de caché no se puede configurar de manera diferente en los ejemplos, solo en init en caso de que alguien se lo pregunte

Una solución para rspec:

Agregue un bloque completo con una clave de metadatos personalizada a su configuración.

RSpec.configure do |config| config.around(:each, :caching) do |example| caching = ActionController::Base.perform_caching ActionController::Base.perform_caching = example.metadata[:caching] example.run Rails.cache.clear ActionController::Base.perform_caching = caching end end

Agregue la clave de metadatos cuando sea necesario el almacenamiento en caché.

describe "visit the homepage", :caching => true do # test cached stuff end