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

È stato utile?

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 -

https://gist.github.com/brettfishman/3868277

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top