2012-12-21 51 views
10

我正在使用RSpec(最新版本,2.12.2)來測試我正在處理的一個小型Ruby類。我的問題是,當RSpec測試失敗時,測試輸出看起來非常冗長,並且顯示了大量錯誤消息,幾乎看起來是完全回溯。這意味着我必須向上滾動才能看到實際的錯誤消息和跟蹤的頂部。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文件,要麼可以申請設置。

回答

11

因此,在與RSpec民間人士on Github聊了一會之後,我設法追捕了這個問題。

問題是,默認情況下,RSpec從回溯行中刪除與Regex/gems /匹配的行。我在名爲~/Dropbox/rubygems/myprojectgems的文件夾中將我的項目放在一個文件夾中,因此每一行回溯都被刪除,並且當發生這種情況時,RSpec明智地向您顯示整個回溯。

這解釋了我所看到的行爲。

它總是這樣愚蠢的。我希望如果有其他人這樣做,也許這個答案會爲他們節省一些時間。

+0

哈哈,真是太棒了。我一直很生氣,RSpec很冗長......我知道我自己的名字是負責任的! – RobinGower

+0

您可以使用https://www.relishapp.com/rspec/rspec-core/docs/configuration/excluding-lines-from-the-backtrace添加自定義回溯過濾器模式。 –

3

看起來像是在運行RSpec與-b,完整的回溯。通常情況下,RSpec不會像這樣顯示自己的內部回溯,即使您的測試失敗了(即拋出異常而不是斷言失敗)。如果您沒有明確使用-b--backtrace運行它,請檢查並確保您沒有在.rspec配置文件中設置該設置,或者您的IDE或其他任何設備沒有通過該設置。

+0

感謝吉姆 - 但是我相信,我不應用'B'選擇的任何地方 - 我剛剛更新了我的問題以更清楚地表明這一點。 –

1

正如Jim所說,有一個-b--backtrace選項將啓用完全回溯。請記住,這不僅僅是可以觸發它的.rspec文件;還有~/.rspec(開發人員的首選選項)。

要記住的另一件事是格式化程序可以吐出它想要的任何回溯部分。格式化程序爲任何第三方格式化程序提供了一種簡單的方法來尊重回溯過濾配置,但它使用的是第三方格式化程序,但不能保證它正確使用該格式化程序。您是否使用內置rspec格式化器之一?

最後,如果它不是其中之一,我就沒有想法。我不得不舉一個例子來回答你的問題。你能想出一個可重複的例子(希望在希望中)?我經常試着在irc.freenode.net的rspec頻道中閒逛,所以也許你可以在那裏抓到我,我們可以通過這種方式進行一些故障排除。

+0

我已經更新了我的問題 - 我在項目中有一個'.rspec',但它沒有運行任何與回溯有關的事物,也沒有'〜/ .rspec'。 –

0

從版本3.4.0/2015年11月11日,可以通過選項來過濾回溯:

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