2016-04-14 14 views
2

Ich habe einen Test, der prüft, ob der Pfad geändert wurde, nachdem der Benutzer eine Option aus den Autovervollständigungsvorschlägen auswählt. Ich teste mit Capybara auf Poltergeist. Aber vermutlich, weil ich den Seitenwechsel über JS auslöse, muss ich jetzt eine Schlafanweisung verwenden, um darauf zu warten, dass die Seite vollständig geladen wird, was natürlich nicht ideal ist.Wie Capybara/Poltergeist warten auf js initiierte Navigation zu beenden?

Dies ist die js:

window.location.href = suggestion.url; 

Und dies ist der Test:

sleep 1# Allow the time to navigate 
expect(current_path).to eq(arg1) 

wo arg1 die erwartete Seite URL ist.

Es funktioniert gut mit Schlaf, aber die Gründe, warum dies nicht optimal ist, sind offensichtlich. Wie kann man den Test schlauer gestalten und warten bis die Navigation stattfindet?

Antwort

6

Sie das eq Matcher mit current_path nicht verwenden (bei den meisten Capybara Dinge tatsächlich), verwenden Sie die have_current_path Matcher

expect(page).to have_current_path(arg1) 

, die das automatische Warten/Wiederholen-Verhalten in Capybara

0

Testen Sie etwas auf der neuen Seite (die nicht auf der Seite vorhanden ist, von der aus Sie navigieren) und rspec wird weiter nachsehen, bis es angezeigt wird (solange es innerhalb der Standardwartezeit liegt) Pfad zB etwas tun, wie dieser erste

expect(page).to have_selector("a.testclass", text: "Some link on your new page") 

Dann wird Ihr Pfadtest:

expect(current_path).to eq(arg1) 
+0

eingebauten verwenden werde Ich dachte, Som So etwas würde es tun, aber es ist ziemlich hacky, meinst du nicht auch? Und dann könnte der Test fehlschlagen, obwohl er korrekt navigiert wurde, was den falschen Eindruck erweckt. –

+0

Ja, ich mache solche Dinge oft, wenn es viele JS in einer App gibt, also scheint es mir "normal" zu sein. Tom Walpoles Antwort sieht in diesem Fall am besten aus. –

Verwandte Themen