2013-04-30 116 views
16

通常,當一個測試失敗時,我花了相當長的時間試圖找出導致它失敗的原因。如果RSpec在測試失敗時可以啓動Ruby調試器,那麼我可以立即檢查本地變量以深入瞭解原因。如果rspec測試失敗,開始ruby調試器

工作,圍繞我現在使用看起來是這樣的:

# withing some test 
debugger unless some_variable.nil? 
expect(some_variable).to be_nil 

但是,這種方法比較麻煩,因爲我第一次等待測試失敗,然後添加調試線,修復該問題,然後必須刪除調試器行,而我希望它的工作更像gdb,它有能力在遇到異常時啓動,而不需要用debugger語句胡說你的代碼庫。

編輯:我試過普利茅斯。它對我來說工作不夠可靠。同樣的發展歷史似乎表明,它不是一個很好的支持寶石,所以我寧願不依賴它。

更新:我嘗試了pry-rescue,發現它很整潔。但是,我使用zeus很多,並想知道是否有辦法使它與pry-rescue一起使用。

回答

20

使用pry-rescue,它的精神繼承普利茅斯:

自述:

如果您使用的RSpec或respec,您可以打開,每次考試失敗撬會話使用救援RSpec的或救援respec:

$ rescue rspec 
From: /home/conrad/0/ruby/pry-rescue/examples/example_spec.rb @ line 9 : 

    6: 
    7: describe "Float" do 
    8: it "should be able to add" do 
=> 9:  (0.1 + 0.2).should == 0.3 
    10: end 
    11: end 

RSpec::Expectations::ExpectationNotMetError: expected: 0.3 
    got: 0.30000000000000004 (using ==) 
[1] pry(main)> 
+0

謝謝 - 我會給這個鏡頭。 – Vighnesh 2013-05-01 19:00:33

+3

有沒有辦法讓'zeus'工作? – Vighnesh 2013-05-06 23:20:46

+1

剛試過最新的宙斯和撬救版本,不起作用 – 23tux 2015-02-04 08:47:22

0

您可以使用普利茅斯寶石https://github.com/banister/plymouth爲此。它使用pry雖然,(更好)替代irb

HTH

+0

我試過普利茅斯。它對我來說工作不夠可靠。同樣的發展歷史似乎表明,它不是一個很好的支持寶石,所以我寧願不依賴它。 – Vighnesh 2013-04-30 00:49:19

1

你需要趕上ExpectationNotMatched例外,它被建造時。將以下代碼包含在您的幫助器中,並且在構造異常時RSpec將停止。這在匹配器內部會有幾個層次,所以在調試器中,請說出「where」,然後「up 5」或「up 6」,然後您將進入塊的instance_exec。調試器不會在我使用的版本中正確顯示代碼,但是您可以再次「增加」一次,並在您的測試被評估的相同上下文中運行代碼,以便您可以檢查實例變量(但看起來不是局部變量)。

require 'debugger' 
require 'rspec' 

Debugger.start 
class RSpec::Expectations::ExpectationNotMetError 
    alias_method :firstaid_initialize, :initialize 

    def initialize *args, &b 
    send(:firstaid_initialize, *args, &b) 
    puts "Stopped due to #{self.class}: #{message} at "+caller*"\n\t" 
    debugger 
    true # Exception thrown 
    end 
end 

describe "RSpec" do 
    it "should load use exceptions on should failure" do 
    @foo = :bar # An instance variable I can examine 
    1.should == 2 
    end 
end 
+0

這看起來很有希望。我會嘗試一下。謝謝,克利福! – Vighnesh 2013-05-01 19:02:35

-1

您可以試試hammertime。只要引發異常,它就會停止並提示您進入交互式調試會話。

+1

[pry-rescue](https://github.com/conradirwin/pry-rescue)(一個pry插件)遠勝於hammertime,它會讓你陷入異常的實際環境中,並讓你走上堆棧 – horseyguy 2013-04-30 14:40:36

+0

I真的應該切換到撬這些天之一... – davogones 2013-04-30 15:06:06

+0

我會檢查出來。謝謝你的提示。 – Vighnesh 2013-05-01 19:03:12

5

你不會不debugger在街區的範圍是可以訪問本地變量(容易),但是RSpec爲您提供周圍鉤住讓你這樣做的:

config.around(:each) do |example| 
    result = example.run 
    debugger if result.is_a?(Exception) 
    puts "Debugging enabled" 
end 

然後,您可以訪問@ivarssubject/let(:var)此時的內容。

+0

有趣。這不會抓住測試失敗,是嗎? – Vighnesh 2013-05-01 19:01:27

2

我喜歡@喬恩 - 羅公司的解決方案(無需額外的寶石),有輕微的編輯:我真的不關心不亞於RSpec::Expectations::ExpectationNotMetError其他錯誤。

config.around(:each) do |example| 
    example.run.tap do |result| 
     debugger if result.is_a?(RSpec::Expectations::ExpectationNotMetError) 
    end 
    end