Come prova di rotaie ETag caching?
-
27-09-2019 - |
Domanda
E 'possibile coprire il mio controller, che è altamente depeinding su Etags con test di unità?
Ecco quello che sto cercando di fare: nel caso in cui se la pagina non è stantio (il che significa che è fresco), sto aggiungendo qualche colpo di testa alla risposta.
Quando sto cercando di testare il tutto (RSpec), indipendentemente dal numero di richieste simili che ho, ho ancora ricevere 200 OK invece di 304, e il mio colpo di testa non viene modificato. Inoltre, se a monitorare request.fresh? (Risposta), è sempre falso.
Tuttavia, funziona perfettamente in del browser. Ho già provato a ActionController stato :: Base.perform_caching = vero, non cambia la situazione generale.
Grazie
Soluzione 3
Ok, ecco un punto:
Prima di colpire la richiesta, letta a tutto ciò che è legato al ETags nel codice Rails e non dimenticate di insieme:
request.env["HTTP_IF_MODIFIED_SINCE"]
request.env["HTTP_IF_NONE_MATCH"]
Dato che sono necessari per il test ETag.
Altri suggerimenti
Ecco come è possibile verificare se la seconda richiesta restituisce 304 risposta:
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
Rails hash il: etag che fornisci:
headers['ETag'] = %("#{Digest::MD5.hexdigest(ActiveSupport::Cache.expand_cache_key(etag))}")
in modo da impostare qualcosa di semplice come
frash_when(:etag => 'foo')
sarebbe avvenire solo mediante il diritto digerire (sono necessarie le virgolette)
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
stesso per modificato:
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
Questo succo è molto utile il test ri ETAG in rspec -
Rails 4.2 adesso anche prende in conto il digest del modello. Per me la seguente ha funzionato:
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'
)
Almeno in Rails 5.2, la soluzione di szeryf fallisce. Questa variazione funziona:
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
Vedi Rails Guide: https: //guides.rubyonrails .org / testing.html # impostazione-headers-e-cgi-variabili