Повторить попытку?
У меня есть сценарий огурца для тестирования возможностей пользовательского интерфейса. Иногда из-за одной из нескольких проблем веб-страница требует много времени, чтобы ответить, а Capybara с ошибкой.
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
повторить (для постоянного количества раз) весь сценарий или шаг соответственно, при ошибке тайм-аута?
Ответы
Ответ 1
Возможно, вы можете сделать это следующим образом:
Around do |scenario, block|
for i in 1..5
begin
block.call
break
rescue Timeout::Error
next
end
end
end
Но я не могу понять, работает ли этот код из-за ошибки (Невозможно вызвать блок несколько раз во время круговой привязки)
Ответ 2
Из Книга огурцов:
Добавьте 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