如何测试是否有任何例外被拯救?

时间:2017-02-22 15:24:28

标签: ruby-on-rails ruby exception testing testcase

有没有办法找出在执行某些代码期间是否引发和获救任何异常?

最好是用ActiveSupport::TestCase而不是RSpec

编写的测试

是否有任何全局ruby异常堆栈或其他东西,我可以检查一下?

2 个答案:

答案 0 :(得分:7)

如果你想成为一个怪物,你可以自己检测错误:

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

非常适合临时健全检查。生产代码很糟糕。

答案 1 :(得分:1)

正如评论中所阐明的那样,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