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

¿Fue útil?

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 -

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

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top