web-dev-qa-db-fra.com

Comment testez-vous une demande AJAX avec RSpec / RoR?

Je suis assez nouveau sur RoR et j'ai récemment commencé à apprendre BDD/Rspec pour tester mon application. Je cherchais un moyen de spécifier une demande AJAX, mais jusqu'à présent, je n'ai pas trouvé beaucoup de documentation à ce sujet.

Quelqu'un sait-il comment faire ça? J'utilise Rails 2.3.8, rspec 1.3.0 et mocha 0.9.8 pour mes talons (que je suis également en train d'apprendre ...)

54
user480826

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

get :index

pour faire une requête HTTP à l'action d'index, vous appelleriez à la place

xhr :get, :index

pour effectuer une requête XmlHttpRequest (AJAX) à l'action d'index à l'aide de GET.

107
Robert Speicher

Rails 5/6

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

get :index, xhr: true

Contexte

Voici le code pertinent dans ActionController :: TestCase . La définition de l'indicateur 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
27
odlp

La syntaxe a changé un peu 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' } }

OBTENIR des demandes:

xhr get :show, id: 10
4
user1136228