2009-04-05 5 views
1

testComment écrivez-vous un test fonctionnel/contrôleur pour vérifier le contenu ajouté via un appel AJAX?

def test_generateCashFlowStmt 
    get :getDateRangeForCashFlowStmt 
    xhr :post, 
     :generate_cash_flow_stmt, 
     {:fromDate => {:year=>"2009", :month => "3", :day=>"1"}, 
     :toDate => {:year=>"2009", :month => "3", :day=>"31"} } 

    table = [ ....  ] 
    assert_equal table, formatCashFlowStatementAsTable(assigns(:cashFlowStmt)) 
    assert_tag :tag => "div", :children => {:count => 1, :only => {:tag=>"table"} } 
    end 

action contrôleur

def generate_cash_flow_stmt 
     puts params 
     fromDate = Date.civil params[:fromDate]["year"].to_i, params[:fromDate]["month"].to_i, params[:fromDate]["day"].to_i 
     toDate = Date.civil params[:toDate]["year"].to_i, params[:toDate]["month"].to_i, params[:toDate]["day"].to_i 

     @cashFlowStmt = CashFlowStatement.new(fromDate, toDate) 
     render :partial => "cash_flow_stmt", :layout => false 
    end 

Voir

<% form_remote_tag(:loading => "Element.show('progress-indicator');", 
     :update => "div_results", 
     :complete => "Element.hide('progress-indicator');", 
     :url=>{:action=>'generate_cash_flow_stmt'}) do %> 
... 
<% end %> 
<div id="div_results"> 

Le test échoue au dernier contrôle, où je vérifie si le titulaire du contenu div est rempli avec la table à la suite de l'appel à generate_cash_flow_stmt ac cess. Bien que je vois la table affichée dans le navigateur, l'action «Afficher la source» affiche une balise div vide. Ce qui donne?

Répondre

1

La source d'affichage affichant une div vide est attendue. Les appels AJAX mettent à jour la dom, mais ne modifient pas la source d'origine. Vous pouvez mieux voir le DOM en utilisant le Firebug. Comme pour le test: L'appel xhr :post ne déclenchera pas le Ajax.Updater et ne met donc pas réellement à jour le div page. (L'Ajax.Updater est ce l'appel xhr En initiant l'appel manuellement dans le test, aucun tel événement n'arrive.) Je ne crois pas non plus que les tests fonctionnels suivent et mettent à jour le DOM ou exécutent le javascript.

Pour obtenir un test réussi, vous devez générer uniquement la requête xhr (ne faites pas le get :getDateRangeForCashFlowStmt), puis confirmez qu'il renvoie le partiel approprié. Depuis le prototype Rails & sont bien testés, vous devriez être en mesure de compter que le form_remote_tag et le Ajax.Updater feront ce qu'ils sont censés faire et construire votre page finale.

0

Vous ne voulez pas tester javascript dans vos tests fonctionnels. Les tests fonctionnels ne couvrent pas du tout le javascript.

Vous pourriez utiliser quelque chose comme Selenium pour tester votre javascript. Le sélénium est essentiellement des tests qui tentent de faire des choses dans les navigateurs. Et les navigateurs sont connus pour supporter javascript beaucoup mieux que les tests fonctionnels de Rails;)