62 votes

Comment tester une requête AJAX avec RSpec/RoR ?

Je suis assez nouveau dans le domaine des RdR et j'ai récemment commencé à apprendre BDD/Rspec pour tester mon application. J'ai cherché un moyen de spécifier une requête AJAX, mais jusqu'à présent je n'ai pas trouvé beaucoup de documentation à ce sujet.

Quelqu'un sait comment faire ? J'utilise rails 2.3.8, rspec 1.3.0 et mocha 0.9.8 pour mes stubs (que je suis également en train d'apprendre...).

112voto

Robert Speicher Points 8292

Si vous parlez de le tester dans les spécifications de votre contrôleur, où vous appelez normalement

get :index

pour faire une demande HTTP à l'action d'index, vous appelleriez plutôt

xhr :get, :index

pour faire une demande XmlHttpRequest (AJAX) à l'action index en utilisant GET.

7 votes

Génial ! C'est ce qui a marché pour moi. xhr :put, :update, :format => "js"

1 votes

@BeMathis ne peut pas être sûr de ce qui est du côté du contrôleur de choses S'il utilise quelque chose comme respond_to { |format| format.js } à rendre alors vous aurez certainement besoin de la format: "js" ou vous recevriez un ActionController::UnknownFormat erreur

0 votes

Format : 'json' est ce que je cherchais. Merci !

45voto

odlp Points 2764

Rails 5 / 6

Depuis Rails 5.0 (avec RSpec 3.X), essayez de paramétrer xhr: true comme ça :

get :index, xhr: true

Contexte

Voici le code correspondant dans le fichier ActionController::TestCase . Réglage de la xhr finit par ajouter les en-têtes suivants :

if xhr
  @request.set_header "HTTP_X_REQUESTED_WITH", "XMLHttpRequest"
  @request.fetch_header("HTTP_ACCEPT") do |k|
    @request.set_header k, [Mime[:js], Mime[:html], Mime[:xml], "text/xml", "*/*"].join(", ")
  end
end

9voto

user1136228 Points 119

La syntaxe a été légèrement modifiée pour Rails 5 et rspec > 3.1 (je crois).

pour les demandes POST :

post :create, xhr: true, params: { polls: { question: 'some' } }

vous devez maintenant définir explicitement params

pour les demandes GET :

get :action, xhr: true, params: { id: 10 }

pour rails 4 et rspec <= 3.1

xhr post :create, { polls: { question: 'some' } }

Demandes GET :

xhr get :show, id: 10

0voto

Reactormonk Points 7990

Le test d'intégration avec cucumber + capybara (+ firefox) compte-t-il comme une spécification AJAX ? :-)

0voto

Dorian Points 1491

Voici un exemple complet :

get "/events", xhr: true, params: { direction: "past" }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X