8
votes

Comment tester les rails Caching etag?

est-il possible de couvrir mon contrôleur, qui dépend fortement des eTags avec des tests unitaires?

Voici ce que j'essaie de faire: Au cas où la page n'est pas obsolète (ce qui signifie qu'il est frais), j'ajoute de l'en-tête à la réponse.

Lorsque j'essaie de tout tester (RSPEC), peu importe le nombre de demandes similaires que j'ai, je reçois toujours 200 OK au lieu de 304, et mon en-tête n'est pas modifié. En outre, si je suivez la demande.fresh? (Réponse), c'est toujours faux.

Cependant, cela fonctionne parfaitement dans le navigateur. J'ai déjà essayé de préciser ActionController :: base.perform_caching = true, cela ne change pas la situation générale.

merci


0 commentaires

6 Réponses :


4
votes

OK, voici un point:

Avant de frapper la demande, lisez tout ce qui est lié à Etags dans Code Rails et n'oubliez pas de définir: xxx

puisqu'il s'agit d'essais Etag.


3 commentaires

Bonjour, pourriez-vous expliquer en détail ce que cela signifie? Lorsque j'ai défini la demande.env, il ne contient toujours pas l'ETAG.


@Tosa S'il vous plaît voir ma réponse ci-dessous pour quelques idées (je ne pouvais pas poster autant de code dans un commentaire).


Comment est-ce une réponse, sans parler de la réponse acceptée? Vous dites faire des recherches et définir des variables env, mais vous ne dites pas quoi de rechercher et de définir les variables env.



5
votes

rails hashes the: etag que vous fournissez: xxx

donc réglage de quelque chose de simple comme xxx

ne serait déclenché que par le bon digest (Les devis doubles sont nécessaires) xxx

même pour modifié: xxx


1 commentaires

Oh, c'était une question de l'âge il y a des âges. Je pense que cela a toujours été des rails 2.3.5, des choses peuvent donc avoir beaucoup changé depuis.



11
votes

Voici comment vous pouvez tester si la deuxième demande renvoie 304 réponse:

    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


0 commentaires

1
votes

Cet essentiel est très utile de tester Etag dans RSPEC -

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


0 commentaires

0
votes

rails 4.2 prend maintenant également en compte le digest du modèle. Pour moi, les suivants ont fonctionné:

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


0 commentaires

0
votes

au moins dans les rails 5.2, la solution de Szeryf échoue. Cette variation fonctionne: xxx

voir les guides de rails: https://guides.rubyonRails.org/testing.html#setting-headers-and-cgi-variables


0 commentaires