【问题标题】:How to get stack trace from a Test::Unit::TestCase如何从 Test::Unit::TestCase 获取堆栈跟踪
【发布时间】:2012-02-19 02:23:28
【问题描述】:

我正在测试一些 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 给我一个完整的堆栈跟踪?

【问题讨论】:

  • 您是否使用rake 运行测试?
  • 这是在 Ruby 1.8、Ruby 1.9 还是两者中?

标签: ruby testunit


【解决方案1】:

查看 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

【讨论】:

    【解决方案2】:

    在课堂上的任何地方使用它来获取完整的堆栈跟踪。我在我的单元测试用例中使用它来调试我的测试类。

    rescue => e
    
    puts e.inspect
    
    puts e.backtrace
    

    【讨论】:

    • 您的解决方案没问题,但问题是它会否定存在 Test::Unit 的需要 - 您建议手动跟踪所有异常。问题是 - 如何修复 Test::Unit 再次有用。
    猜你喜欢
    • 2010-11-10
    • 1970-01-01
    • 2010-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多