除錯 Bundler 可能具有挑戰性,請不要灰心 🤗。
在嘗試除錯之前,請務必遵循 開發設定 文件。
除錯最簡單的方法是列印除錯。將 puts
陳述式放在您想要查看物件或變數的程式碼中的任何位置,您將在主控台輸出中看到您的 puts
。
這在執行測試時特別有用。
ruby puts "stacktrace: #{caller_locations(0).join("\n")}" puts "@definition: #{@definition}" puts "specification.class.name: #{specification.class.name}" puts "spec.method(:to_checksum).source_location: #{spec.method(:to_checksum).source_location}" # 等
若要瞭解更多列印除錯策略,[TODO:連結至文件]
REPL(或讀取-評估-列印迴圈)是一種與您的程式碼互動的方式。
使用 REPL,您可以查看物件和變數的值、堆疊追蹤、方法定義的位置等。
若要使用 REPL,請在您想要查看的地方放置 binding.irb
。當您的程式碼到達中斷點時,將開啟一個互動式 irb
主控台。
若要瞭解更多有關使用 IRB 的資訊,[TODO:連結至文件]
互動式除錯就像 REPL + 能夠逐行推進程式碼執行。
在本地測試 Bundler 時,您可以使用任何您熟悉的除錯器進行互動式除錯。
debug
和 pry-byebug
是常見的最愛。debug
自 v3.1 以來已包含在 Ruby 中。
您只需要將您選擇的除錯器寶石安裝為全域性。然後,您需要在執行本地 Bundler 之前在命令列中載入它。
bash RUBYOPT=-rdebug dbundle # 適用於 debug 寶石 RUBYOPT=-rpry-byebug dbundle # 適用於 pry-byebug
注意 在測試套件中無法進行互動式除錯。大多數測試使用 Open3 在子處理序中執行 Bundler,並將輸出擷取到字串中,這使得即使您能載入它,也無法使用 pry。
在本地測試最簡單的方式是設定一個包含 Gemfile 的目錄,然後執行 Bundler shell 別名(有關設定別名的說明,請參閱 開發設定 文件)。
我們建議將此目錄放在 tmp
內,這樣您的本地測試才不會意外提交。
bash cd tmp mkdir [本地測試目錄名稱] && cd [本地測試目錄名稱] dbundle init
然後您應該會有一個 Gemfile,可以根據測試需要進行編輯。
預設情況下,初始化的 Gemfile 遠端是 "https://rubygems.org"
。您可以新增任何在 rubygems 上託管的 gem,然後執行 Bundler shell 別名 (dbundle
) 來測試您的程式碼。
```ruby # frozen_string_literal: true
source “https://rubygems.org”
gem ‘tiny_css’ ```
在您希望偵錯器暫停的任何地方設定中斷點(debug
的 binding.break
或 pry-byebug
的 binding.pry
)。執行您的 Bundler shell 別名。
bash RUBYOPT=-rdebug dbundle
您的中斷點將顯示在您的主控台中,並已暫停。
如果您有一個非常具體的場景想要測試(可能是執行測試套件時失敗的範例),最簡單的方法是使用先前測試套件執行中來自 tmp 的 gem。
如果您尚未執行,請並行執行測試套件。
bash bin/parallel_rspec
然後您會在 bundler/tmp
目錄中找到已建置的 gem,例如 bundler/tmp/1/gems/remote1/
您可以使用指向測試執行中已建置 gem 的檔案來源設定您的 Gemfile。
```ruby # frozen_string_literal: true
source “file:///[路徑到 repo 的 bundler 目錄]/tmp/1/gems/remote1/”
gem “rack”, ‘=0.9.1’ ```
然後您可以像從 RubyGems 來源擷取 gem 時在先前範例中所做的那樣進行測試。