2012-03-25 11 views
0

Ich benutze Ruby on Rails 3.2.2, Gurke-Schienen-1.3.0, Rspec-Schienen-2.8.1 und Capybara-1.1.2 mit dem Selenium-Treiber. Ich habe ein Problem bezüglich der Parallelität bei der Ausführung von JavaScript-Szenarios (angenommen, dass mein Fall mit einem Parallelitätsproblem zusammenhängt).Wie vermeidet man Nebenläufigkeitsprobleme durch Ausführen von @ Javascript-Szenarien?

In meiner .feature Datei ich habe:

Feature: ... 
    ... 

    @javascript 
    Scenario: ... 
    Given ... 
    When I log out 
    Then I should be redirected to the home page 

In meinem Schritt Definition .rb Datei ich habe:

Then /^I should be redirected to the home page$/ do 
    current_path.should == root_path 
end 

Wenn ich die cucumber Befehlszeile im Terminal-Fenster laufen, so dass Tests auszuführen, Ich bekomme diesen Fehler:

$ cucumber 
Using the default profile... 

Feature: ... 
    ... 

    @javascript 
    Scenario: ... 
    ... 
    When I log out 
    Then I should be redirected to the home page 
     expected: "/" 
     got: "/user" (using ==) (RSpec::Expectations::ExpectationNotMetError) 
     ... 

Allerdings wenn in meinem Schritt Definition .rb Datei I

Then /^I should be redirected to the home page$/ do 
    sleep(1) 

    current_path.should == root_path 
end 

verwenden funktioniert es wie erwartet: alle Tests bestanden.

Also, auch wenn das Problem scheint, gelöst gibt es eine bessere Möglichkeit, um mein Problem zu behandeln? Wenn ja, was ist die "richtige"/"häufig verwendete" Lösung (vielleicht mit einigen Capybara API) ?

Antwort

1

Es ist kein Nebenläufigkeit. Das Problem ist, dass Gurke nicht mit Ihrer Anwendung synchronisiert ist. Die Testseite weiß nichts darüber, ob Ihre Aktion die Ausführung abgeschlossen hat oder nicht. Wenn Sie also den Pfad angeben, den Ihre Anwendung nicht generiert hat, wird die Antwort tatsächlich umgeleitet.

Wenn Sie in Capybara schauen, werden Sie sehen, dass es abfragt, damit das Element erscheint. (Mit Schutz max Wartezeit). So können Sie entweder den gleichen Ansatz verfolgen und für eine gewisse Zeit pollen, oder Sie können einen fauleren Ansatz wählen und in Ihrem Test vor dem Testen des Pfads einen Schritt hinzufügen, der nach Inhalt auf der Zielseite sucht. Sie können sich also auf den eingebauten Mechanismus von Capybara verlassen.

+0

In der ** [Capybara offizielle Dokumentation] (https://github.com/jnicklas/capybara) ** im Abschnitt "** Drivers >> Selenium **" heißt es "* [...] Capybara kann blockieren und darauf warten, dass Ajax-Anforderungen nach dem Interagieren mit der Seite abgeschlossen werden. Um dieses Verhalten zu aktivieren, setzen Sie die Option: resynchronize driver auf true. [...] * ", aber (wenn Sie darauf verweisen Sie sagen "Das Problem ist, dass Gurke nicht mit Ihrer Anwendung synchronisiert ist") Ich habe nicht verstanden, wie und wo die '' resynchronize' 'Treiberoption eingestellt werden soll. * Hinweis *: In Code, den ich in der Frage gemeldet habe, teste ich eine JavaScript-Umleitung. – Backo

Verwandte Themen