【问题标题】:RSpec shorter backtrace output for test failures用于测试失败的 RSpec 较短的回溯输出
【发布时间】:2012-12-21 00:35:03
【问题描述】:

我正在使用 RSpec(最新版本,2.12.2)来测试我正在研究的一个小型 Rub​​y 类。我的问题是,当 RSpec 测试失败时,测试输出看起来非常冗长,并显示大量错误消息,几乎是完整的回溯。这意味着我必须向上滚动才能看到实际的错误消息和跟踪的顶部。

我相信默认情况下 RSpec 应该这样做,但它似乎并没有为我做这件事。例如,如果我运行 rspec spec/my_spec.rb:132(只运行 L132 上的一项测试),我会得到以下输出:

 Failure/Error: @f.has_changed?("test").should be_true
   expected: true value
        got: false
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-expectations-2.12.1/lib/rspec/expectations/fail_with.rb:33:in `fail_with'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-expectations-2.12.1/lib/rspec/expectations/handler.rb:33:in `handle_matcher'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-expectations-2.12.1/lib/rspec/expectations/syntax.rb:53:in `should'
 # /Users/JackFranklin/Dropbox/Sites/rubygems/filefixtures/spec/filefixtures_spec.rb:137:in `block (4 levels) in <top (required)>'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example.rb:114:in `instance_eval'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example.rb:114:in `block in run'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example.rb:254:in `with_around_each_hooks'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example.rb:111:in `run'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:388:in `block in run_examples'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:384:in `map'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:384:in `run_examples'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:369:in `run'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:370:in `block in run'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:370:in `map'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:370:in `run'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:370:in `block in run'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:370:in `map'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:370:in `run'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/command_line.rb:28:in `block (2 levels) in run'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/command_line.rb:28:in `map'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/command_line.rb:28:in `block in run'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/reporter.rb:34:in `report'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/command_line.rb:25:in `run'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/runner.rb:80:in `run'
 # /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/runner.rb:17:in `block in autorun'

如您所见,这绝对是巨大的。我周围没有任何 RSpec 配置文件可能会改变传递给 RSpec 的配置。

有人见过这个吗?我试过谷歌搜索,但搜索没有结果。

编辑:然后我设置配置以确保它正在应用默认的回溯清理:

RSpec.configure do |config|
  # RSpec automatically cleans stuff out of backtraces;
  # sometimes this is annoying when trying to debug something e.g. a gem
  config.backtrace_clean_patterns = [
    /\/lib\d*\/ruby\//,
    /bin\//,
    /gems/,
    /spec\/spec_helper\.rb/,
    /lib\/rspec\/(core|expectations|matchers|mocks)/
  ]
end

但这并没有什么不同。查看输出,应该已经过滤掉了大部分内容,但似乎没有应用配置?

再次编辑:

在我的配置中,我什至可以运行cleaned_from_backtrace?(line) 来查看是否应该清理一行。这将返回true

 config.cleaned_from_backtrace?("/Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-expectations-2.12.1/lib/rspec/expectations/fail_with.rb:33:in `fail_with'")

但终端中的实际输出保持不变!

编辑 3:

我正在使用命令rspec 运行 RSpec,仅此而已。项目的.rspec 文件包含:

--color
--format progress

也没有~/.rspec 文件可以应用设置。

【问题讨论】:

    标签: ruby rspec


    【解决方案1】:

    所以在与 RSpec 人员on Github 多聊了一会儿之后,我设法找到了问题所在。

    问题在于,默认情况下,RSpec 会从回溯中删除与 Regex /gems/ 匹配的行。我将我的项目放在一个文件夹中,其名称为gems~/Dropbox/rubygems/myproject,所以回溯的每一行都被删除,当这种情况发生时,RSpec 会明智地向您显示整个回溯。

    这解释了我所看到的行为。

    总是像那样愚蠢。我希望如果其他人这样做,也许这个答案会节省他们一些时间。

    【讨论】:

    • 哈哈,太棒了。我一直对 RSpec 如此冗长感到恼火......我几乎不知道我自己的名字负责!
    • 您可以使用relishapp.com/rspec/rspec-core/docs/configuration/… 添加自定义回溯过滤模式。
    • @AlyssaRoss 你应该创建一个带有链接的答案,这是从回溯中排除某些宝石和线条的正确方法
    【解决方案2】:

    看起来您正在使用-b 运行 RSpec,以获得完整的回溯。通常,RSpec 不会像那样显示自己的内部回溯,即使您的测试严重失败(即抛出异常而不仅仅是断言失败)。如果您没有使用-b--backtrace 明确运行它,请检查并确保您没有在.rspec 配置文件中设置该设置,或者您的IDE 或任何未通过它的东西。

    【讨论】:

    • 谢谢 Jim - 但是我确信我不会在任何地方应用 b 选项 - 我刚刚更新了我的问题以更清楚地显示这一点。
    【解决方案3】:

    正如 Jim 所说,有一个 -b--backtrace 选项可以启用完整的回溯。请记住,不仅仅是.rspec 文件可能会触发它;还有~/.rspec(开发人员的首选选项)。

    要记住的另一件事是格式化程序可以吐出它想要的回溯的任何部分。格式化程序为任何第 3 方格式化程序提供了一种尊重回溯过滤配置的简单方法,但是如果您使用的是第 3 方格式化程序,则不能保证它可以正确使用它。您是否在使用内置的 rspec 格式化程序之一?

    最后,如果不是其中之一,我就没有主意了。我必须有一个例子来回答你的问题。你能想出一个可重复的例子(希望是要点)?我尝试定期在 irc.freenode.net 的 rspec 频道闲逛,所以也许你可以在那里找到我,我们可以通过这种方式进行一些故障排除。

    【讨论】:

    • 我已经更新了我的问题 - 我在项目中有一个 .rspec,但它没有运行任何与回溯相关的东西,也没有 ~/.rspec
    【解决方案4】:

    从版本 3.4.0 / 2015-11-11 开始,可以通过选项过滤回溯:

    RSpec.configure do |config|
       config.filter_rails_from_backtrace!
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-23
      • 2020-03-16
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多