2010-07-19 5 views
1

J'essayais encore Rails, cette fois la version 3, mais je me suis coincé en écrivant des tests pour une action que j'appelle seulement à distance.Rails: meilleur moyen de tester une action appelée à distance?

Un exemple concret:

Contrôleur

class PeopleController < ApplicationController 
    def index 
    @person = Person.new 
    end 
    def create 
    @person = Person.new(params[:person]) 
    @person.save 
    end 
end 

Voir (index.html.erb)

<div id="subscription"> 
    <%= form_for(@person, :url => { :action => "create" }, :remote => true) do |f| %> 
    <%= f.text_field :email %> 
    <%= f.submit "Subscribe" %> 
    <% end %> 
</div> 

Voir (create.js.erb)

<% if @person.errors.full_messages.empty? %> 
    $("#subscription").prepend('<p class="notice confirmation">Thanks for your subscription =)</p>'); 
<% else %> 
    $("#subscription").prepend('<p class="notice error"><%= @person.errors.full_messages.last %></p>'); 
<% end %> 

Comment puis-je tester ce formulaire à distance submi ssion? Je voudrais juste savoir si les messages d'avis sont présentés correctement. Mais si j'essaye de faire juste

test "create adds a new person" do 
    assert_difference 'Person.count' do 
    post :create, :people => {:email => '[email protected]'} 
    end 
    assert_response :success 
end 

Il dira que l'action "créer" manque un modèle.

Comment tes gars testent-ils habituellement les appels à distance?

Répondre

1

Pourriez-vous simplement utiliser la fonction 'xhr' au lieu de la fonction 'post'? Un exemple peut être trouvé au http://weblogs.java.net/blog/2008/01/04/testing-rails-applications, si vous recherchez 'xhr'. Mais même alors, je suis curieux, même avec un appel à distance, n'avez-vous pas besoin de retourner QUELQUE CHOSE? Même juste un en-tête OK?

+0

Merci jasonpgignac, qui résout mon problème majeur, ne pas pouvoir soumettre la requête à distance. D'une manière ou d'une autre, je pourrais trouver cette méthode 'xhr'. Fonctionne comme un charme pour "assert_response: le succès". Maintenant j'essaie de trouver un moyen de tester les résultats du javascript exécuté. Je présente un message différent s'il y avait des erreurs sur la soumission ou non. Mais assert_select ne me laisse pas interroger le code HTML de la page, après avoir lancé la méthode "get: index" et la méthode "xhr". Une idée de comment vérifier si le bon message a été présenté? – sdsantos

+0

Eh bien, pour clarifier que je comprends ce que vous demandez - essayez-vous de tester le javascript qui est retourné par votre contrôleur, à la suite de l'appel xhr? parce que vous pouvez tester le contenu de ce qui est retourné. Mais si vous essayez de tester un javascript qui est exécuté sur la page pour voir si le comportement réel est plus difficile, vous ne pouvez pas lui demander d'exécuter un javascript et d'afficher la réponse. Vous feriez peut-être mieux d'utiliser quelque chose comme Selenium avec Webrat, où il ouvre en fait un navigateur et un utilisateur behvaiour. – jasonpgignac

+0

Ouais, je voulais tester le résultat sur la page après l'exécution du javascript. Je vais vérifier ces bibliothèques. Encore merci. – sdsantos

Questions connexes