Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
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?
@aslakhellesoy

This comment has been minimized.

Copy link

@aslakhellesoy aslakhellesoy commented Sep 20, 2011

Wouldn't this peg the CPU and possibly starve the thing you're waiting for?

@mattwynne

This comment has been minimized.

Copy link
Owner Author

@mattwynne mattwynne commented Sep 20, 2011

Good point. Needs to take a nap in the loop. Updated.

@mitchlloyd

This comment has been minimized.

Copy link

@mitchlloyd mitchlloyd commented Oct 4, 2013

@mattwynne Looks like there is a syntax error on line 6 with the colon.

@xam7247

This comment has been minimized.

Copy link

@xam7247 xam7247 commented Aug 10, 2015

Stumbled across this, and realised that the gist no more works since rspec expectation failure now subclasses from Exception rather than StandardError (rspec/rspec-expectations@eafa55d#diff-f14d34de26325e61579baa36128c97cb)

Here's a fork that rescues both StandardError and RSpec::Expectations::ExpectationNotMetError:
https://gist.github.com/xam7247/290868f3c6f0f72e9b01

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.