2012-12-24 3 views
10

Ich habe ein Gurken-Szenario zum Testen von UI-Funktionen. Manchmal aufgrund einer der verschiedenen Probleme, Web-Seite braucht viel Zeit, um zu reagieren und Capybara Timeout mit folgendem Fehler.Wiederholen bei Timeout?

ruby-1.9.3-p327/lib/ruby/1.9.1/net/protocol.rb:146:in `rescue in rbuf_fill' 
ruby-1.9.3-p327/lib/ruby/1.9.1/net/protocol.rb:140:in `rbuf_fill' 
ruby-1.9.3-p327/lib/ruby/1.9.1/net/protocol.rb:122:in `readuntil' 
ruby-1.9.3-p327/lib/ruby/1.9.1/net/protocol.rb:132:in `readline' 
ruby-1.9.3-p327/lib/ruby/1.9.1/net/http.rb:2562:in `read_status_line' 
ruby-1.9.3-p327/lib/ruby/1.9.1/net/http.rb:2551:in `read_new' 

Meine Frage ist-

Kann ich irgendwie Gurke Szenario zwingen oder Capybara erneut zu versuchen (für eine konstante Anzahl) ganze Szenario oder Schritt jeweils auf Timeout-Fehler?

Antwort

2

Vielleicht können Sie es wie folgt tun:

Around do |scenario, block| 
    for i in 1..5 
    begin 
     block.call 
     break 
    rescue Timeout::Error 
     next 
    end 
    end 
end 

Aber ich kann nicht herausfinden, wenn dieser Code aufgrund des Fehlers (It's not possible to call block several times in Around hook)

+0

Danke für die Antwort. Die zweite Antwort auf diesen Beitrag funktionierte für mich, aber ich werde es mir merken. –

+0

+1 Ich habe Timeout :: Fehler für nur Ausnahme ausgelagert. Nicht sicher, warum Timeout :: Error es für mich nicht fing>. < – kikuchiyo

+0

Aus irgendeinem Grund, mit dem Timeout :: Error, wird es immer noch nicht gefangen. Put-in-Puts-Aussagen, und es läuft nur einmal, und scheitert einmal ... oh der Schmerz der Schmerz der Lauf Capybara/Selen/Webkit auf dieser App! – kikuchiyo

1

Von The Cucumber book funktioniert:

hinzufügen a eventually method, die versucht, einen Codeblock auszuführen, bis entweder ein Fehler behoben wird oder ein Zeitlimit erreicht wird. Hier

ist der Code für diese Methode:

module AsyncSupport 
    def eventually 
    timeout = 2 
    polling_interval = 0.1 
    time_limit = Time.now + timeout 
    loop do 
     begin 
     yield 
     rescue Exception => error 
     end 
     return if error.nil? 
     raise error if Time.now >= time_limit sleep polling_interval 
    end 
    end 
end 
World(AsyncSupport) 

Die Methode aufgerufen genannt werden, wie aus einem step_definition folgt:

Then /^the balance of my account should be (#{CAPTURE_CASH_AMOUNT})$/ do |amount| 
    eventually { my_account.balance.should eq(amount) } 
end 
+0

Danke! Dies könnte mein Problem gelöst haben. Keine Fehler mehr. –

+0

Ich bin froh, dass es hilfreich war! Markieren Sie die Antwort als akzeptiert, wenn sie Ihnen geholfen hat. –