如何从Test :: Unit :: TestCase获取堆栈跟踪

时间:2012-02-19 02:23:28

标签: ruby testunit

我正在测试一些Ruby代码并且有一个失败的Test :: Unit :: TestCase。不幸的是,失败报告只给出了最大的错误,而不是完整的堆栈跟踪。具体来说,它说:

 1) Failure:
test_tp_make(TestScripts::TestTpMake) [test/test_scripts.rb:73]:
Exception raised:
<#<NoMethodError: undefined method `[]' for nil:NilClass>>.

引用的行号(73)是我测试用例中assert_nothing_raised代码块的开头,后者又启动另一个代码块,后者又调用大型库。

我尝试使用--verbose标志运行测试,遗憾的是这不会更改异常输出。我尝试查阅Test :: Unit文档,但它似乎没有枚举可用的选项(例如,没有什么有用的here)。搜索Web和StackOverflow浮出水面如何在Rails中启用堆栈跟踪,但这是非Rails ruby​​代码。

我可以从测试中提取失败的代码并在Test :: Unit之外运行它,使我能够看到所有的输出。但是每次测试失败都会很痛苦。

有谁知道如何让Test :: Unit给我一个完整的堆栈跟踪?

2 个答案:

答案 0 :(得分:14)

查看Ruby 1.8中的Test :: Unit代码,似乎所有错误都通过Test :: Unit :: Error对象来过滤其#long_display方法中的回溯。没有配置,所有跑步者都将使用相同的过滤跟踪。

蛮力猴子补丁来获取整个痕迹:(我把它放在我的单个测试用例文件中;也许你可以把它放在测试助手中)

require 'test/unit/util/backtracefilter'

module Test::Unit::Util::BacktraceFilter
  def filter_backtrace(backtrace, prefix=nil)
    backtrace
  end
end

用于Ruby 1.9的猴子补丁(使用minitest)

def MiniTest.filter_backtrace(bt)
  bt
end

答案 1 :(得分:1)

在您的课程中的任何位置使用它来获得完整的堆栈跟踪。我在单元测试用例中使用它来调试我的测试类。

rescue => e

puts e.inspect

puts e.backtrace