est-il possible de couvrir mon contrôleur, qui dépend fortement des eTags avec des tests unitaires? P>
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. P>
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. P>
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. P>
merci p>
6 Réponses :
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: p> puisqu'il s'agit d'essais Etag. p> p>
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.
rails hashes the: etag que vous fournissez: donc réglage de quelque chose de simple comme p> ne serait déclenché que par le bon digest (Les devis doubles sont nécessaires) p> même pour modifié: p>
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.
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
Cet essentiel est très utile de tester Etag dans RSPEC - P>
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' )
au moins dans les rails 5.2, la solution de Szeryf échoue. Cette variation fonctionne: voir les guides de rails: https://guides.rubyonRails.org/testing.html#setting-headers-and-cgi-variables P> P>