1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
|
module RescueSpecs
class Captor
attr_accessor :captured_error
def self.should_capture_exception
captor = new
captor.capture('some text').should == :caught # Ensure rescue body still runs
captor.captured_error.message.should == 'some text'
end
end
class ClassVariableCaptor < Captor
def capture(msg)
raise msg
rescue => @@captured_error
:caught
end
def captured_error
self.class.remove_class_variable(:@@captured_error)
end
end
class ConstantCaptor < Captor
# Using lambda gets around the dynamic constant assignment warning
CAPTURE = -> msg {
begin
raise msg
rescue => CapturedError
:caught
end
}
def capture(msg)
CAPTURE.call(msg)
end
def captured_error
self.class.send(:remove_const, :CapturedError)
end
end
class GlobalVariableCaptor < Captor
def capture(msg)
raise msg
rescue => $captured_error
:caught
end
def captured_error
$captured_error.tap do
$captured_error = nil # Can't remove globals, only nil them out
end
end
end
class InstanceVariableCaptor < Captor
def capture(msg)
raise msg
rescue => @captured_error
:caught
end
end
class LocalVariableCaptor < Captor
def capture(msg)
raise msg
rescue => captured_error
@captured_error = captured_error
:caught
end
end
class SafeNavigationSetterCaptor < Captor
def capture(msg)
raise msg
rescue => self&.captured_error
:caught
end
end
class SetterCaptor < Captor
def capture(msg)
raise msg
rescue => self.captured_error
:caught
end
end
class SquareBracketsCaptor < Captor
def capture(msg)
@hash = {}
raise msg
rescue => self[:error]
:caught
end
def []=(key, value)
@hash[key] = value
end
def captured_error
@hash[:error]
end
end
end
|