Pergunta

É possível cobrir meu controlador, que está altamente indicando em ETAGS com testes de unidade?

Aqui está o que estou tentando fazer: Caso se a página não seja obsoleta (o que significa que é fresco), estou adicionando algum cabeçalho à resposta.

Quando estou tentando testar tudo (RSPEC), não importa quantas solicitações semelhantes eu, ainda recebo 200 OK em vez de 304, e meu cabeçalho não é modificado. Além disso, se eu rastrear a solicitação.Fresh? (Resposta), é sempre falso.

No entanto, funciona perfeitamente no navegador. Eu já tentei declarar ActionController :: base.perform_caching = true, isso não muda a situação geral.

obrigada

Foi útil?

Solução 3

Ok, aqui está um ponto:

Antes de atingir a solicitação, leia tudo o que está relacionado ao código ETAGS in Rails e não se esqueça de definir:

request.env["HTTP_IF_MODIFIED_SINCE"]
request.env["HTTP_IF_NONE_MATCH"]

Já que eles são necessários para o teste de ETAG.

Outras dicas

Veja como você pode testar se a segunda solicitação retorna 304 Resposta:

    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 Hashes o: ETAG que você fornece:

headers['ETag'] = %("#{Digest::MD5.hexdigest(ActiveSupport::Cache.expand_cache_key(etag))}")

Então, definindo algo simples como

frash_when(:etag => 'foo')

só seria desencadeado pelo resumo direito (as citações duplas são necessárias)

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

O mesmo para modificado:

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 essência é muito útil teste de re etag no rSpec -

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

O Rails 4.2 agora também aceita para contabilizar o resumo do modelo. Para mim, o seguinte funcionou:

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'
)

Pelo menos no Rails 5.2, a solução da SZERYF falha. Esta variação funciona:

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

Veja Rails Guides: https://guides.rubyonrails.org/testing.html#setting-teners-and-cgi-Variables

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top