class BeforeAndAfter

Modeled after RSpec::Matchers::BuiltIn::Change

Public Class Methods

new(before_proc, after_proc) click to toggle source
# File lib/rspec/matchers/before_and_after.rb, line 21
def initialize(before_proc, after_proc)
  @before_proc = before_proc
  @after_proc  = after_proc
end

Public Instance Methods

matches?(event_proc) click to toggle source
# File lib/rspec/matchers/before_and_after.rb, line 26
def matches?(event_proc)
  @event_proc = event_proc
  perform_change(event_proc)
end
supports_block_expectations?() click to toggle source
# File lib/rspec/matchers/before_and_after.rb, line 31
def supports_block_expectations?
  true
end

Private Instance Methods

indent_multiline_message(message) click to toggle source
# File lib/rspec/matchers/before_and_after.rb, line 59
def indent_multiline_message(message)
  message.lines.map do |line|
    line =~ /\S/ ? '   ' + line : line
  end.join
end
perform_change(event_proc) click to toggle source
# File lib/rspec/matchers/before_and_after.rb, line 37
def perform_change(event_proc)
  reraise_with_prefix 'before making the change:' do
    @before_proc.call
  end

  return false unless Proc === event_proc
  event_proc.call

  reraise_with_prefix 'after making the change:' do
    @after_proc.call
  end
  true
end
reraise_with_prefix(prefix) { || ... } click to toggle source
# File lib/rspec/matchers/before_and_after.rb, line 51
def reraise_with_prefix(prefix)
  begin
    yield
  rescue RSpec::Expectations::ExpectationNotMetError
    raise $!, "#{prefix}\n#{indent_multiline_message($!.message)}", $!.backtrace
  end
end