2012-12-24 42 views
10

Tôi có một kịch bản dưa chuột để thử nghiệm các tính năng giao diện người dùng. Đôi khi do một trong nhiều vấn đề, trang web mất rất nhiều thời gian để trả lời và Capybara hết thời gian với lỗi sau.Thử lại khi hết giờ?

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' 

Câu hỏi của tôi là-

Tôi có thể bằng cách nào đó buộc kịch bản dưa chuột hoặc Capybara để thử lại (đối với hằng số lần) toàn bộ kịch bản hoặc bước tương ứng, về lỗi thời gian chờ?

Trả lời

2

Có lẽ, bạn có thể làm điều đó như thế này:

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

Nhưng tôi không thể tìm ra nếu mã này hoạt động vì lỗi (It's not possible to call block several times in Around hook)

+0

Cảm ơn bạn đã trả lời. Câu trả lời thứ hai cho bài đăng này làm việc cho tôi nhưng tôi sẽ ghi nhớ điều này. –

+0

+1 Tôi đã đổi thời gian chờ :: Lỗi chỉ ngoại lệ. Không chắc tại sao Timeout :: Lỗi không bắt được nó>< – kikuchiyo

+0

Vì một số lý do, với Timeout :: Error, nó vẫn không bị bắt. Đặt trong đặt báo cáo, và nó chỉ chạy một lần, và thất bại một lần ... oh đau đớn đau chạy capybara/selenium/webkit trên ứng dụng này! – kikuchiyo

1

Từ The Cucumber book:

Add một số eventually method liên tục cố gắng chạy một khối mã cho đến khi nó ngừng tăng lỗi hoặc đạt đến giới hạn thời gian.

Đây là mã cho phương pháp đó:

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) 

Phương pháp gọi được gọi như sau từ một step_definition:

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

Cảm ơn bạn! Điều này có thể đã giải quyết được vấn đề của tôi. Không nhận được lỗi nữa. –

+0

Vui vì nó hữu ích! Đánh dấu câu trả lời là được chấp nhận nếu nó đã giúp bạn. –

Các vấn đề liên quan