2012-12-24 16 views
10

Ho uno scenario Cucumber per testare le caratteristiche dell'interfaccia utente. A volte a causa di uno dei numerosi problemi, la pagina Web richiede molto tempo per rispondere e Capybara va in time-out con il seguente errore.Riprovare al 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' 

La mia domanda è-

Posso in qualche modo forzare scenario cetriolo o Capybara riprovare (per numero costante di volte) scenario tutto o passo, rispettivamente, in caso di errore di timeout?

risposta

2

Forse, si può fare in questo modo:

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

ma non riesco a capire se questo codice funziona a causa del bug (It's not possible to call block several times in Around hook)

+0

Grazie per la risposta. La seconda risposta a questo post ha funzionato per me, ma terrò questo a mente. –

+0

+1 Ho sostituito Timeout :: Errore solo per Eccezione. Non sono sicuro del motivo per cui Timeout :: Error non lo ha rilevato per me>. < – kikuchiyo

+0

Per qualche motivo, con Timeout :: Error, non viene ancora rilevato. Inserisci le istruzioni put, e viene eseguito solo una volta, e fallisce una volta ... oh il dolore il dolore di eseguire capybara/selenium/webkit su questa app! – kikuchiyo

1

Da The Cucumber book:

Add a eventually method che continua a provare a eseguire un blocco di codice finché non interrompe un errore o raggiunge un limite di tempo.

Qui è il codice per quel metodo:

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) 

Il metodo chiamato essere chiamato come segue da uno step_definition:

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

Grazie! Questo potrebbe aver risolto il mio problema. Non ottenere più errori. –

+0

Sono contento che sia stato utile! Segnare la risposta come accettata se ti ha aiutato. –

Problemi correlati