2017-12-15 7 views
0

Ich habe rspec Funktionen Tests, die alle fehlschlagen, weil ich den angegebenen Pfad nicht besuchen kann. Sie alle scheinen nach dem Anmelden am Stammpfad zu hängen. Ein Screenshot zeigt, dass die Seite immer noch im Stammpfad verbleibt. Die Testschritte funktionieren im Browser, dh das Routing ist korrekt. Irgendwelche Ideen?Rspec Feature-Test: Kann einen Pfad nicht besuchen

Ich erhalte die folgende Fehlermeldung für den Test:

Failure/Error: page.evaluate_script('jQuery.active').zero?

Auszug meiner Funktion spec Tests:

describe 'follow users' do 

    let!(:user) { FactoryGirl.create(:user) } 
    let!(:other_user) { FactoryGirl.create(:friend) } 

    describe "Managing received friend request", js: true do 

    let!(:request) { Friendship.create(user_id: other_user.id, friend_id: user.id, accepted: false) } 

    before do 
     login_as(user, :scope => :user) 
     visit followers_path 
    end 

    it 'friend request disappear once user clicks accept' do 
     click_on "Accept" 
     wait_for_ajax 
     expect(current_path).to eq(followers_path) 
     expect(page).to have_css(".pending-requests", text: "You have 0 pending friend requests") 
     expect(page).to_not have_css(".pending-requests", text: other_user.name) 
     expect(page).to_not have_link("Accept") 
     expect(page).to_not have_link("Decline") 
    end 

    end 
end 

Antwort

0

versuchen, diesen Ansatz für all Ajax-Anfragen warten Ende:

def wait_for_ajax 
    Timeout.timeout(Capybara.default_wait_time) do 
    active = page.evaluate_script('jQuery.active') 
    until active == 0 
     active = page.evaluate_script('jQuery.active') 
    end 
    end 
end 

Genommen von:

+0

Hallo danke für den Vorschlag, aber die Verwendung von wait_for_ajax Helfer verursacht die Fehlermeldung Fehler/Fehler: page.evaluate_script ('jQuery.active'). Null? ich habe versucht, expect (page) .to have_content() zu verwenden, aber screenshot zeigt immer noch root Pfad Seite – doyz

+0

Welche Version von Capybara verwenden Sie? – s3tjan

+0

Ich benutze 2.7.1 – doyz

0

Das Problem hier ist, dass Sie 'wait_for_ajax' entweder auf einer Seite aufrufen, die jQuery nicht enthält, oder zu einem Zeitpunkt, als es noch nicht geladen wurde. Die Lösung besteht darin, die Verwendung von wait_for_ajax zu beenden und stattdessen die Capybara-Erwartungen/Matcher wie vorgesehen zu verwenden. Es gibt sehr wenige Fälle, in denen wait_for_ajax tatsächlich benötigt wird und selbst dann ist es normalerweise ein Zeichen für schlechte UI-Entscheidungen (keine Anzeichen für den Benutzer, dass etwas passiert). Sie sollten auch nicht den Matcher mit current_path verwenden und stattdessen den Capybara have_current_path Matcher verwenden, da er wie alle Capybara-bereitgestellten Matcher auf ein Wartungs-/Wiederholungsverhalten wartet.

it 'friend request disappear once user clicks accept' do 
    click_on "Accept" 
    expect(page).to have_current_path(followers_path) 
    expect(page).to have_css(".pending-requests", text: "You have 0 pending friend requests") 
    expect(page).to_not have_css(".pending-requests", text: other_user.name) 
    expect(page).to_not have_link("Accept") 
    expect(page).to_not have_link("Decline") 
end 

Wenn das nicht für Sie arbeiten, dann entweder auf die Schaltfläche klicken eigentlich nicht Seite Änderungen Triggerung (überprüfen Sie die Testprotokoll), Ihre Capybara.default_max_wait_time ist nicht hoch genug für die Hardware festgelegt Sie testen auf, Ihre login_as Anweisung ist nicht wirklich einloggen den Benutzer (obwohl dann würde ich erwarten, dass der Klick auf die Schaltfläche akzeptieren, fehlgeschlagen), oder Sie haben einen Fehler in Ihrer App.

Wenn es so login_as nicht tatsächlich in dann stellen Sie sicher, Protokollierung der Server die AUT läuft im selben Prozess wie die Tests verwendet werden, laufen, wenn Sie mit puma, dass es doesn in der Ausgabe sicherstellen, dass Mittel Ich sage nicht, dass es im Clustermodus läuft.

+0

Danke @ThomasWalpole, ich habe wait_for_ajax entfernt und bin zu have_current_path gewechselt, aber mein Test ist nicht erfolgreich. Ich habe viele andere Tests fehlgeschlagen und merkwürdiges Verhalten nach Ajaxaufrufen, entweder nicht ein click_on durchführend oder bei root_path stecken geblieben (sie sind alle scheitern jetzt, wenn ich sie vor einiger Zeit getestet habe und sie alle bestanden haben). Mir ist bewusst, dass expect (page) .to have_content anstelle von wait_for_ajax für Ajax-Aufrufe verwendet werden sollte. Könnte ich dich mit meinen rspec Tests in meinem github Repo ärgern: https://github.com/dianameow/diana-portal/tree/master/spec – doyz

+0

Ich denke, dass ich das Problem zu capybaras click_on nicht bearbeitet habe in allen meinen Tests – doyz

+0

@doyz Ich habe versucht, Ihre Tests und viele von ihnen mit verschiedenen Fehlern wie Fehler über fehlende Methoden auf Null, etc. Allerdings würde ich nur den einen Test ausführen, über den Sie sich alleine erkundigt haben, und es geht gut für mich, nicht sicher, was Sie vorhaben, ich würde empfehlen, das Capybara-Webkit-Juwel zu löschen und erneut zu installieren. –

Verwandte Themen