byebug Gem

[byebug]Gemの導入と使い方

Gemfileに以下のように記述する(railsをインストールしている場合は、デフォルトでインストールされている)

gem 'byebug'


$ bundle install


下記のようにデバッグしたいところに[byebug]を記述する

[spec/system/task_spec.rb]

RSpec.describe 'Task', type: :system do
  let(:project) { create(:project) }

  describe 'Task削除' do
    context '正常系' do
      # FIXME: テストが失敗するので修正してください
      it 'Taskが削除されること' do
        task = FactoryBot.create(:task, title: "test_title", project_id: project.id)
        visit project_tasks_path(project)
        click_link 'Destroy'
        page.driver.browser.switch_to.alert.accept
        byebug
        expect(page).not_to have_content task.title
        expect(Task.count).to eq 0
        expect(current_path).to eq project_tasks_path(project)
      end
    end
  end

上記のように記述して、以下のようにテストを実行すると[byebug]を記述した部分で処理が止まり、下記のように表示される

$ bundle exec rspec

Image from Gyazo

例えば、[next]を入力して実行すると次の行に移動する

※ポイント

・下記のように[help]を入力して実行すると、[byebug]で処理が止まっているところで使えるコマンドが確認できる

Image from Gyazo

・下記のように記述して実行するファイルを指定することもできる
$ byebug 実行するファイル名

・下記のようなコードがあり、[byebug]で処理を止めたところで[page.body]を実行するとRSpec上でのブラウザの表示画面のHTMLが確認できる

  describe 'Task削除' do
    context '正常系' do
      # FIXME: テストが失敗するので修正してください
      it 'Taskが削除されること' do
        task = FactoryBot.create(:task, title: "test_title", project_id: project.id)
        visit project_tasks_path(project)
        click_link 'Destroy'
        page.driver.browser.switch_to.alert.accept
        byebug
        expect(page).not_to have_content task.title
        expect(Task.count).to eq 0
        expect(current_path).to eq project_tasks_path(project)
      end
    end
  end

下記が[page.body]を実行して得られたRSpecのブラウザ上のHTML

Image from Gyazo

[/n]は、改行を示している

・[byebug]で処理を止めている箇所で変数の確認をすることもできる

参考記事:

byebugの導入から使い方まで - Qiita

Ruby / Ruby on Rails デバッグ方法まとめ - Qiita

byebugでRubyスクリプトをコマンドラインデバッグする - Qiita