Ruby 测试失败的RSpec较短回溯输出

Ruby 测试失败的RSpec较短回溯输出,ruby,rspec,Ruby,Rspec,我正在使用RSpec(最新版本,2.12.2)测试一个小的Ruby类。我的问题是,当RSpec测试失败时,测试输出似乎异常冗长,并显示大量错误消息,几乎是一个完整的回溯。这意味着我必须向上滚动以查看实际的错误消息和跟踪的顶部 我相信默认情况下RSpec应该这样做,但它似乎并没有为我这样做。例如,如果我运行rspec spec/my_spec.rb:132(只需在L132上运行一个测试),我会得到以下输出: Failure/Error: @f.has_changed?("test").shoul

我正在使用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'
但这没什么区别。查看输出,应该将大部分内容过滤掉,但似乎没有应用配置

再次编辑:

在我的配置中,我甚至可以从_backtrace?(line)运行
cleaned_,查看是否应该清理一行。这将返回
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
文件。

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

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

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


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

因此,在与rspec的人多聊了一会儿之后,我设法找到了问题所在

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

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


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

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

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

我已经更新了我的问题-我在项目中有一个
.rspec
,但它没有运行任何与回溯相关的东西,而且也没有
~/.rspec
。谢谢Jim-不过我相信我不会在任何地方应用
b
选项-我刚刚更新了我的问题,以更清楚地说明这一点。哈哈,太棒了。我一直对RSpec如此冗长感到恼火。。。我一点也不知道是我自己的名字引起的!您可以使用添加自定义回溯筛选模式。@AlyssaRoss您应该创建一个带有链接的答案,这是从回溯中排除某些宝石和线条的正确方法
RSpec.configure do |config|
   config.filter_rails_from_backtrace!
end