rosh-1228のメモ

自身の勉強したことをメモしてます。

railsテストのデバッグ方法をメモ

railsテストのデバッグ方法

railsのsystemテストでハマってしまい、その時に使ったデバッグ方法を残しておく。

binding.pry

binding.pryをコード中に書くと、コード実行時にbinding.pryの場所で止めてくれるgem

ブレークポイントとして機能する。

以下のように、確認したい処理の手前に書く。

def update
    binding.pry
    if @user.update(user_params)
        成功時の処理
    else
        失敗時の処理
    end
end

すると、以下のように処理が止まる。

    18: def update
    19:   binding.pry
 => 20:   if @user.update(user_params)
    21:     成功時の処理
    22:   else
    23:     失敗時の処理
    24:   end
    25: end

[1] pry(#<Controller>)>

ここで例えば以下のように@user.update(user_params)を実行した時の処理がわかる。

実際にupdateが成功しているのか失敗しているのかわからない時などに使える。

[1] pry(#<Controller>)> @user.update(user_params)
=> false

他にもこの時点のuser_paramsの内容なども確認できる。

@user.errors.full_messages

以下のように.errors.full_messagesを使うことで先程のupdateでどんなエラーが発生していたかがわかる。

今回はユーザー情報にos:があったのだが、テストデータで用意していたユーザにos:がなかったため、エラーが発生していた。

[1] pry(#<Controller>)> @user.errors.full_messages
=> [使用しているOSを選択してください。]

これはテストだけでなく、普通に実装している時も使用できる。

binding.pryも普通に実装している時も使えるが、今回のようにテストでエラーが発生した場合もデバッグに使える。

page.save_screenshot('~~~/screenshot.png')

capybaraをインストールすることで使用できる。

テストコード中に書くことで、スクリーンショットを取得できる。 以下の場合、更新ボタンをクリック後のページをスクリーンショットで取得できる。

test 'test' do
    click_on '更新'
    page.save_screenshot('~~~/screenshot.png')
end

save_and_open_page

こちらもcapybaraをインストールして使う。

こちらもテストコードの中に記述して使用する。

save_and_open_pageを書いた時点の画面の状態をブラウザで確認することができる。

おわりに

p や putsを使ってデバッグも可能だが、更新系の処理を実際に確かめたかったり、画面の状態を確かめたい場合は、これらのメソッドを使って行きたい。