Como prueba de carriles ETag almacenamiento en caché?
-
27-09-2019 - |
Pregunta
¿Es posible cubrir mi controlador, que es altamente depeinding en Etags con pruebas unitarias?
Esto es lo que estoy tratando de hacer: En caso de que la página no está demasiado cargado (lo que significa que es fresco), estoy añadiendo un poco de cabecera de respuesta.
Cuando estoy tratando de probar todo (rspec), no importa cuántas peticiones similares que tengo, todavía recibo OK 200 en lugar de 304, y mi cabecera no se modifican. Por otra parte, si puedo realizar el seguimiento request.fresh? (Respuesta), siempre es falsa.
Sin embargo, funciona perfectamente en el navegador. Ya he probado a ActionController estado :: Base.perform_caching = true, no cambia la situación general.
Gracias
Solución 3
Ok, aquí hay un punto:
Antes de golpear la solicitud, leer todo lo que está relacionado con ETags en código de Rails Y no se olvide de conjunto:
request.env["HTTP_IF_MODIFIED_SINCE"]
request.env["HTTP_IF_NONE_MATCH"]
Ya que están exigidos en la prueba de ETag.
Otros consejos
Así es como se puede comprobar si la segunda solicitud de devolución 304 respuesta:
get action, params
assert_response 200, @response.body
etag = @response.headers["ETag"]
@request.env["HTTP_IF_NONE_MATCH"] = etag
get action, params
assert_response 304, @response.body
Rieles desmenuza el: etag usted proporciona:
headers['ETag'] = %("#{Digest::MD5.hexdigest(ActiveSupport::Cache.expand_cache_key(etag))}")
por lo que establecer algo simple como
frash_when(:etag => 'foo')
sólo se desencadena por la derecha digerir (las comillas son necesarias)
def with_etag
if stale?(:etag => 'foo')
render :text => 'OK'
end
end
... tested by ...
@request.env['HTTP_IF_NONE_MATCH'] = '"acbd18db4cc2f85cedef654fccc4a4d8"'
get :with_etag
assert_equal 304, @response.status.to_i
mismo para modificación:
def with_modified
if stale?(:last_modified => 1.minute.ago)
render :text => 'OK'
end
end
... tested by ...
@request.env['HTTP_IF_MODIFIED_SINCE'] = 2.minutes.ago.rfc2822
get :with_modified
assert_equal 304, @response.status.to_i
Esta GIST es muy útil la prueba de re etag en rspec -
Carriles 4,2 ahora también toma en cuenta la Recopilación de la plantilla. Para mí la siguiente trabajó:
def calculate_etag(record, template)
Digest::MD5.hexdigest(ActiveSupport::Cache.expand_cache_key([
record,
controller.send(:lookup_and_digest_template, template)
])).inspect
end
def set_cache_headers(modified_since: nil, record: nil, template: nil)
request.if_modified_since = modified_since.rfc2822
request.if_none_match = calculate_etag(record, template)
end
set_cache_headers(
modified_since: 2.days.ago,
record: @book,
template: 'books/index'
)
Al menos en Rails 5.2, la solución de szeryf falla. Esta variación hace el trabajo:
get action, parms
assert_response 200, @response.code
etag = @response.headers["ETag"]
get action, parms, headers: { "HTTP_IF_NONE_MATCH": etag }
assert_response 304, @response.code
Vea Rieles Guías: https: //guides.rubyonrails .org / testing.html # ajuste-headers-y-cgi-variables