2016-12-09 1 views
0

Dans mon application rails, j'ai une sélection sur la barre de navigation comme suit:rails rspec capybara sélectionner ne fonctionne pas

<body> 
    <div id="wrapper"> 

    <!-- Navigation --> 
    <nav role="navigation" style="margin-bottom: 0"> 
    <div class="navbar-default sidebar hidden-sm hidden-xs" role="navigation"> 
     <div class="sidebar-nav"> 
     <ul class="nav" id="side-menu"> 
      <li> 
      <h4 class="sidebar-title">SGPLAN</h4> 
      </li> 
      <li class="logo"> 
      <form action="#"> 
       <select name="" id="change_plan" class="form-control plan"> 
       <option value="1" id="plan_id" selected="">first </option> 
       <option value="2" id="plan_id">other </option> 
       </select> 
      </form> 
      </li> 

et javascript application.js pour charger la page d'accueil lorsque l'utilisateur sélectionne une autre option .

$(document).ready(function() { 
    //... 
    $('#change_plan').on('change', function(){ 
     var str = '' 
     str += $(this).val() + " "; 
     setCookie("plan", str,1); 
     window.location.href = "/"; 
    }) 
}); 

J'ai écrit le test suivant pour cette fonction à l'aide rspec, capybara et capybara-webkit:

require 'rails_helper' 

feature "Change plan", :js do 
    background do 
    login_as create(:admin_user), scope: :user 
    Agency.current = Agency.find_by(initials: 'SECTI').id 
    FactoryGirl.create(:other_plan) 
    Plan.current = Plan.find_by(name: 'first').id 
    end 

    scenario "User changes the current plan" do 
    visit "/milestones" 
    save_and_open_page 
    select('other', from: 'change_plan') 
    # within '#change_plan' do 
    # find("option[value='2']").click 
    # end 
    # find('#change_plan').find('option', text: 'other').select_option 
    expect(current_path).to eq("/") 
    end 
end 

résultats save_and_open_page dans l'extrait de code html, comme indiqué ci-dessus.

Le résultat de l'exécution du test est la suivante:

Failures: 

    1) Change plan User changes the current plan 
    Failure/Error: expect(current_path).to eq("/") 

     expected: "/" 
      got: "/milestones" 

     (compared using ==) 
    # ./spec/features/plans/change_plan_spec.rb:19:in `block (2 levels) in <top (required)>' 

Finished in 1 minute 1.71 seconds (files took 2.04 seconds to load) 
1 example, 1 failure 

Si je find('#change_plan')... ou find("option...") (selon les lignes commentées) dans le test au lieu de la sélection, le résultat est le même.

Mes versions sont (sur l'Gemfile.lock):

capybara (2.7.1) 
capybara-webkit (1.11.1) 
database_cleaner (1.5.3) 
factory_girl_rails (4.7.0) 
rails (4.2.5) 
rspec-core (3.5.4) 
rspec-expectations (3.5.0) 
rspec-mocks (3.5.0) 
rspec-rails (3.5.2) 

et ruby 2.3.0p0 (2015-12-25 revision 53290) [x86_64-linux]

Que dois-je faire faire ce test au travail? Dois-je utiliser une plate-forme de test différente? Nous sommes relativement engagés à rspec mais moins à capybara.

Mise à jour

J'ai finalement obtenu ce travail avec l'aide de Thomas et employant plusieurs suggestions qu'il a fournies.

  1. Une erreur de type javascript s'est produite avec le pilote webkit capybara.
  2. J'ai essayé le pilote de sélénium, mais j'ai obtenu une erreur 503 à l'étape de la visite/des jalons.
  3. Je suis ensuite passé au pilote de poltergeist et j'ai constaté que le comportement d'attente posait également un problème - j'ai donc dû utiliser le has_current_path.
+0

essayer d'ajouter 'sommeil 1' avant l'appel' attendre (... ' –

Répondre

0

Vous ne devriez pas utiliser le matcher eq avec current_path car il n'a pas de comportement d'attente/de nouvelle tentative. Cela signifie que vous vérifiez le chemin avant que la page ait le temps de changer. Au lieu d'utiliser le matcher have_current_path fourni par Capybara

expect(page).to have_current_path('/') 
+0

have_current_path ne fonctionne pas non plus. Il donne seulement un échec avec une formulation légèrement différente. J'ai également essayé de dormir 100 et même combiné have_current_path et de dormir sans succès.Par conséquent, le manque de comportement d'attente peut faire partie du problème - mais il y a quelque chose d'autre qui doit être corrigé aussi.Outres suggestions? –

+0

Si has_current_path n'a pas faire la différence, ce n'est pas un problème d'attente - la page ne change pas réellement 2 possibilités pour cela - 1. capybara-webkit ne déclenche pas de changement quand un nouveau select est choisi (ce serait un bug dans capybara-webkit), bien que ce comportement soit testé dans leurs tests. Vous pouvez essayer 'find ('# change_plan'). Trigger ('change')' après la sélection pour voir si cela fonctionne. 2. Vous avez une erreur dans l'un de vos assets JS qui empêche le gestionnaire de changement d'être ajouté.La concaténation des assets peut faire apparaître des erreurs dans les tests qui n'affectent pas dev. –

+0

find ('# change_plan'). Trigger ('change') ne fonctionnait pas non plus. Cela laisse donc la possibilité d'une erreur dans un actif JS en raison de la concaténation. Mais j'ai commis le péché de pousser le changement à la production sans que le test fonctionne. Si je comprends bien, les actifs sont également concaténés dans la production et, par conséquent, je m'attendrais à ce que la fonctionnalité échoue là aussi bien que dans le test. Mais il travaille en production. Des idées sur ce que je pourrais faire de plus pour aller au fond des choses? –