2012-12-24 12 views
10

私は、UI機能をテストするためのキュウリシナリオを持っています。時にはいくつかの問題の1つのために、ウェブページは応答するのに多くの時間を要し、カピバラは次のエラーで時間切れになります。タイムアウトで再試行しますか?

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' 

は - 私の質問

私は何とかタイムアウトエラーで、それぞれ全体のシナリオやステップ(一定回数)再試行するキュウリのシナリオやCapybaraを強制することはできますか?

答えて

2

たぶん、あなたはこのようにそれを行うことができます。

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

しかし、このコードは、バグのために動作している場合、私はThe Cucumber bookから(It's not possible to call block several times in Around hook

+0

感謝ここ

は、そのメソッドのコードです。このポストの2番目の答えは私のために働いたが、私はこれを念頭に置いておく。 –

+0

+1ちょうど例外のためにTimeout :: Errorをスワップアウトしました。 Timeout :: Errorがなぜそれをキャッチしていないのか分かりません。< – kikuchiyo

+0

何らかの理由で、Timeout :: Errorで、まだ捕らえられていません。 putsステートメントを入れ、それは一度だけ実行され、一度失敗...ああ痛みは、このアプリで実行しているcapybara/selenium/webkitの痛み! – kikuchiyo

1

を把握することはできません。

追加しますeventually methodは、エラーの発生を停止するか、または時間制限に達するまで、コードブロックを実行しようとし続けます。

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) 

step_definitionから次のように呼び出される呼ばれる方法:返信用

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

ありがとうございます!これは私の問題を解決したかもしれません。これ以上エラーは発生しません。 –

+0

うれしかったことがうれしい!それがあなたを助けたならば、答えを受け入れたものとしてマークしてください。 –

関連する問題