Capybara et Rspec: de façon correcte à utiliser dans un délai de() et have_selector ()?

- Je utiliser rspec 2.6.0 et le Capybara 1.1.1 pour les tests d'acceptation.

Avec une vue semblable à la suivante:

<tr >
  <td>Team 3 Name</td>
  <td>true</td>
  <td><a href="/teams/3">Show</a></td>
  <td><a href="/teams/3/edit">Edit</a></td>
  <td><a href="/teams/3">Deactivate</a></td>
</tr>
<tr >
  <td>Team 4 Name</td>
  <td>true</td>
  <td><a href="/teams/4">Show</a></td>
  <td><a href="/teams/4/edit">Edit</a></td>
  <td><a href="/teams/4">Deactivate</a></td>
</tr>

Je veux écrire un test d'acceptation qui déclare: "l'Équipe 3 n'a PAS la "Deactivate " lien". J'attends la suite de l'échec:

within('tr', :text => 'Team 3 Name') do |ref|
  page.should_not have_selector('a', :text => 'Deactivate')
end

Mais il passe. Afin de tester ce qui se passe, j'ai écrit l'absurde:

lock = false
within('tr', :text => 'Team 3 Name') do |ref|
  page.should have_selector('a', :text => 'Deactivate')
  page.should_not have_selector('a', :text => 'Deactivate')
  lock = true
end
lock.should be_true

Qui passe ainsi.

Je suis en supposant que le champ d'application de la have_selector() appel à l'aide n'est pas limité par l'intérieur() bloquer, mais je ne suis pas sûr pourquoi. Le capybara documentation utilise ce modèle et ne semble pas à mentionner tous les pièges.
Quelle est la bonne façon de l'utiliser à l'intérieur pour limiter la portée de mon choix?
Je vous remercie.
/Salernost

Avez-vous vérifié pour voir si page est nul, par une étrange coïncidence, ou de les mettre dans un débogueur en ligne en haut de l'essai de sorte que vous pouvez obtenir à une console de sortie et de la valeur de page, ou ajouté à l'étape And show me the page de sorte que votre navigateur va vous montrer une copie de la page dans l'état où il est en droit avant l'exécution de ce test? Si oui, qu'est-ce que le framework de test voir réellement?
Merci pour votre réponse. Je peux vérifier que la page n'est pas nul, via la sortie de débogage, et encore plus, quand je l'appelle: "met réf.texte" à l'intérieur de l'intérieur() bloc-je obtenir le bon: "l'Équipe 3 Nom du vrai Spectacle Éditer Désactiver". Notez que j'ai singe-corrigés dans un délai de() pour donner le contexte pour que je puisse appeler du texte. J'ai patché dans un délai de() APRÈS j'ai identifié ce comportement étrange si, et à cet effet, n'est pas la cause. 🙂
thread peuvent être d'intérêt.
Merci Mark. J'avais effectivement lu ce document et à sentir que c'est une question un peu différente. Dans le Capybara documentation qui indique clairement que dans() retourne le premier match, tous les matchs, ce qui est bien si vous garantie que :texte => 'Équipe 3 Nom" est le seul ou le premier sur la page. Pour plus de clarté, quand j'imprime le contexte retourné dans un délai de() correctement portées à la <td>, et imprime "l'Équipe 3 Nom du vrai Spectacle Éditer Désactiver". Si je suis capable d'en arriver là, il me semble qu'il n'y a pas de raison pour le have_selector et have_no_selector retourner la valeur true.

OriginalL'auteur salernost | 2012-03-27