Skip to content

Instantly share code, notes, and snippets.

@mattwynne
Created September 20, 2011 11:52
Show Gist options
  • Star 33 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save mattwynne/1228927 to your computer and use it in GitHub Desktop.
Save mattwynne/1228927 to your computer and use it in GitHub Desktop.
eventually helper method for making assertions against asynchronous systems
# usage:
# it "should return a result of 5" do
# eventually { long_running_thing.result.should eq(5) }
# end
module AsyncHelper
def eventually(:options = {})
timeout = options[:timeout] || 2
interval = options[:interval] || 0.1
time_limit = Time.now + timeout
loop do
begin
yield
rescue => error
end
return if error.nil?
raise error if Time.now >= time_limit
sleep interval
end
end
end
# Can we put this into RSpec somewhere?
@dorianmariecom
Copy link

dorianmariecom commented Nov 18, 2021

with returning the result so that user = eventually { User.last! } works for instance

module Helpers::Eventually
  def eventually(timeout: 2, &block)
    maximum_at = Time.zone.now + timeout

    loop do
      begin
        result = block.call
      rescue => error
        raise error if Time.zone.now >= maximum_at
      else
        return result
      end
    end
  end
end                                                                      

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment