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