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óduloconfig.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 comomem_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
- El caché necesita ser borrado entre ejemplos
- 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