module RSpec::Matchers::Timeout

persist matcher defined here @example

expect do
  #routine
end.to persist.at_least(3) # or 3.seconds if you use ActiveSupport

Public Class Methods

included(*args) click to toggle source
# File lib/rspec/launchbox/timeout_matchers.rb, line 9
def self.included(*args)
  RSpec::Matchers.define :persist do
    supports_block_expectations
    @should_complete_block = nil

    chain :at_least do |time|
      @time = time
      @should_complete_block = false
    end

    chain :at_most do |time|
      @time = time
      @should_complete_block = true
    end

    match do |actual|
      fail "Block expected, got #{actual.class}" unless actual.respond_to? :call 
      fail "Expected 'persist.at_least(<seconds>)' or 'persist.at_most(<seconds>)'" if @should_complete_block.nil?
      begin
        ::Timeout.timeout(@time, &actual)
        @block_complete = true
      rescue ::Timeout::Error
        @block_complete = false
      end
      @block_complete == @should_complete_block
    end
  end
end