簡體   English   中英

如果 rspec 測試失敗,則啟動 ruby​​ 調試器

[英]Start ruby debugger if rspec test fails

通常,當測試失敗時,我會花相當長的時間試圖找出導致它失敗的原因。 如果 RSpec 可以在測試失敗時啟動 Ruby 調試器,那將很有用,這樣我就可以立即檢查局部變量以深入了解原因。

我現在使用的解決方法如下所示:

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

但是,這種方法很麻煩,因為我首先等待測試失敗,然后添加調試器行,修復問題,然后必須刪除調試器行,而我希望它更像gdb ,它能夠啟動當遇到異常時,無需在代碼庫中添加debugger語句。

編輯:我試過普利茅斯。 它對我來說還不夠可靠。 此外,開發歷史似乎表明它不是一個得到很好支持的 gem,所以我寧願不依賴它。

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

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

來自自述文件:

如果您正在使用 RSpec 或 respec,您可以使用救援 rspec 或救援 respec 在每次測試失敗時打開一個 pry 會話:

$ 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)>

如果debugger不在塊的范圍內,您將無法(輕松)訪問局部變量,但是RSpec為您提供了環繞鈎子,讓您可以這樣做:

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

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

我喜歡@jon-rowe 的解決方案(不需要額外的寶石),稍作修改:我真的不像RSpec::Expectations::ExpectationNotMetError那樣關心其他錯誤。

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

您需要在構建時捕獲 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

從 Rspec 文檔:

RSpec 嘗試提供有用的失敗消息,但對於需要更具體信息的情況,您可以在示例中定義自己的消息。這適用於除運算符匹配器之外的任何匹配器。

我所做的是在該消息中調用 pry。 看例子:

describe "failing" do
  context "test" do
    it "should start pry" do
      a = 3
      b = 1
      expect(a).to be == b, "#{require 'pry';binding.pry}"
    end
  end

調試愉快!

您可以為此使用plymouth gem https://github.com/banister/plymouth 不過,它正在使用pry ,這是irb的(更好的)替代品。

HTH

你可以試試錘擊時間 每當引發異常時,它都會停止並提示您進入交互式調試會話。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM