如何测试是否有异常被拯救?
How to test whether any exception was rescued?
有没有办法找出在某些代码的执行过程中是否引发并挽救了异常?
最好在用 ActiveSupport::TestCase
而不是 RSpec
编写的测试中
是否有任何全局 ruby 异常堆栈或其他东西,我可以检查一下?
如果你想成为怪物,你可以自己检测错误:
class StandardError
@@called = false
def initialize
@@called = true
super
end
def self.called
@@called
end
end
#test it out like so:
def raise_arg_error
raise ArgumentError
rescue
end
puts ArgumentError.called #false
raise_arg_error
puts ArgumentError.called #true
非常适合临时完整性检查。生产代码很糟糕。
如评论中所述,OP 需要它用于调试目的,而不是用它编写测试。
Kernel#set_trace_func
让您拦截低级事件,例如引发错误:
set_trace_func(proc do |event, *_|
puts 'Raised!' if event == 'raise'
end)
raise 'Oh, no!' rescue :foo
您可以 运行 #set_trace_func
在您尝试调试的代码之前。如果没有抛出异常,但钩子记录了加注 - 有人救了它。
这可能会产生一些噪音,具体取决于您正在执行的操作。幸运的是,您可以按文件和行过滤它:
set_trace_func(proc do |event, file, line, *_|
if event == 'raise' && file == 'test.rb' && line == 42
puts "Raised on #{file}:#{line}!"
end
end)
它甚至为您提供了绑定,因此您可以下拉调试器:
require 'irb'
set_trace_func(proc do |event, *_, error_binding, _|
error_binding.irb if event == 'raise'
end)
def foo
bar = 42
raise 'Oh, no!' rescue :baz
end
foo
# Opens an irb
# > bar # => 42
有没有办法找出在某些代码的执行过程中是否引发并挽救了异常?
最好在用 ActiveSupport::TestCase
而不是 RSpec
是否有任何全局 ruby 异常堆栈或其他东西,我可以检查一下?
如果你想成为怪物,你可以自己检测错误:
class StandardError
@@called = false
def initialize
@@called = true
super
end
def self.called
@@called
end
end
#test it out like so:
def raise_arg_error
raise ArgumentError
rescue
end
puts ArgumentError.called #false
raise_arg_error
puts ArgumentError.called #true
非常适合临时完整性检查。生产代码很糟糕。
如评论中所述,OP 需要它用于调试目的,而不是用它编写测试。
Kernel#set_trace_func
让您拦截低级事件,例如引发错误:
set_trace_func(proc do |event, *_|
puts 'Raised!' if event == 'raise'
end)
raise 'Oh, no!' rescue :foo
您可以 运行 #set_trace_func
在您尝试调试的代码之前。如果没有抛出异常,但钩子记录了加注 - 有人救了它。
这可能会产生一些噪音,具体取决于您正在执行的操作。幸运的是,您可以按文件和行过滤它:
set_trace_func(proc do |event, file, line, *_|
if event == 'raise' && file == 'test.rb' && line == 42
puts "Raised on #{file}:#{line}!"
end
end)
它甚至为您提供了绑定,因此您可以下拉调试器:
require 'irb'
set_trace_func(proc do |event, *_, error_binding, _|
error_binding.irb if event == 'raise'
end)
def foo
bar = 42
raise 'Oh, no!' rescue :baz
end
foo
# Opens an irb
# > bar # => 42