[英]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
此時您可以訪問@ivars
和subject
/ 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.