问题 RSpec较短的回溯输出用于测试失败


我正在使用RSpec(最新版本,2.12.2)来测试我正在研究的小型Ruby类。我的问题是,当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 文件或者可以应用设置。


10951
2017-12-21 00:35


起源



答案:


所以在与RSpec民众聊天之后 在Github上,我成功地追捕了这个问题。

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

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

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


11
2017-12-21 20:16



哈哈那很精彩。我一直很生气,RSpec如此冗长......我知道自己的名字很少有责任! - RobinGower
您可以使用 relishapp.com/rspec/rspec-core/docs/configuration/... 添加自定义回溯过滤器模式。 - Alyssa Ross
@AlyssaRoss你应该创建一个带有链接的答案,这是从回溯中排除某些宝石和线条的正确方法 - Rudolf Olah


答案:


所以在与RSpec民众聊天之后 在Github上,我成功地追捕了这个问题。

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

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

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


11
2017-12-21 20:16



哈哈那很精彩。我一直很生气,RSpec如此冗长......我知道自己的名字很少有责任! - RobinGower
您可以使用 relishapp.com/rspec/rspec-core/docs/configuration/... 添加自定义回溯过滤器模式。 - Alyssa Ross
@AlyssaRoss你应该创建一个带有链接的答案,这是从回溯中排除某些宝石和线条的正确方法 - Rudolf Olah


看起来你正在运行RSpec -b,完整的回溯。通常情况下,RSpec不会显示自己的内部回溯,即使你的测试失败很严重(即抛出异常而不是断言失败)。如果您没有明确地运行它 -b 要么 --backtrace,检查并确保您没有设置 .rspec 配置文件,或您的IDE或其他任何未通过它。


3
2017-12-21 01:15



谢谢吉姆 - 不过我有信心我没有申请 b 选择任何地方 - 我刚刚更新了我的问题,以便更清楚地表明这一点。 - Jack Franklin


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

另外要记住的是格式化程序可以吐出它想要的任何回溯部分。格式化程序为任何第三方格式化程序提供了一种简单的方法来尊重回溯过滤配置,但是您使用的是第三方格式化程序,并不能保证它正确使用它。您使用的是内置的rspec格式化程序吗?

最后,如果它不是其中之一,我就是出于想法。我必须有一个例子来回答你的问题。你能想出一个可重复的例子(希望如此)吗?我经常尝试在irc.freenode.net的rspec频道闲逛,所以也许你可以抓住我,我们可以通过这种方式进行一些故障排除。


1
2017-12-21 01:49



我已经更新了我的问题 - 我确实有 .rspec 在项目中,它没有运行与回溯有关的任何事情,而且没有 ~/.rspec 无论是。 - Jack Franklin


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

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

0
2017-10-07 19:38