Amazon Fire HD 10 タブレット - 10インチHD ディスプレイ 32GB ブラック
¥19,980 (2025年4月28日 13:11 GMT +09:00 時点 - 詳細はこちら価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。本商品の購入においては、購入の時点で当該の Amazon サイトに表示されている価格および発送可能時期の情報が適用されます。)【Android 15 タブレット 初登場】Bmax I10 Plus アンドロイド 15 タブレット 10インチ、12GB+128GB+1TB拡張、WidevineL1 Netflix対応、8コアCPU T606 タブレット、6000mAh+Type-C充電+5GWiFi+BT5.0、OTG+顔認識+無線投影+画面分割+FMラジオ、Android 15 タブレット 10インチ wi-fiモデル
¥16,900 (2025年4月28日 13:11 GMT +09:00 時点 - 詳細はこちら価格および発送可能時期は表示された日付/時刻の時点のものであり、変更される場合があります。本商品の購入においては、購入の時点で当該の Amazon サイトに表示されている価格および発送可能時期の情報が適用されます。)
gempry-rails
、pry-byebug
を導入しているにも関わらず、binding.pryが機能していない状態。itブロック
にも確実に定義している。
参考記事:Rspecでbindingを使って変数の中身を調べる方法
今回は例としてusersテーブルにcreateした時、presence: trueを定義したカラムがnilだった場合、バリデーションエラーが機能するかをテストします。
※今回はあえてcreateにタイポをさせています。
user_spec.rb
describe 'バリデーションチェック'
it 'nameが空だった場合、バリデーションエラーが入る' do
user = User.craete(name: "hogehoge", age: 20, email: "hoge@example.com")
# ここにbinding.pryを定義してみる
binding.pry
expect(user).to be_invalid
end
エラーが発生したコードの後にbinding.pry
を記述していた
エラーが発生したタイミングでit内の処理は中断されます。そして次に定義したitが呼び出されるので、エラーコードの後に書いたbinding.pryはスルーしてしまいます。
user_spec.rb
describe 'バリデーションチェック'
it 'nameが空だった場合、バリデーションエラーが入る' do
# createのタイポによるメソッド未定義エラー
user = User.craete(name: nil, age: 20, email: "hoge@example.com")
# ここで処理がストップする。binding.pryは呼び出されない。
binding.pry
expect(user).to be_invalid
end
# 次のitに移行する。
it 'ageが空だった場合、バリデーションエラーが入る' do
user = User.create(name: "hogehoge", age: nil, email: "hoge@example.com")
expect(user).to be_invalid
end
エラーが出てしまった後でもすべてのitブロックが呼び出されていたので、エラーが発生してもすべてのコードを読み込んでくれていると勘違いしていました。
通常だとエラーが発生した時点ですぐにエラー画面が表示するので、「ここで処理が止まっているんだな」と視覚的にわかりやすいのですが…
今回の現象でエラーが出てしまった時の挙動について、少し理解が深まったかなと思います。
binding.pryが使えない原因としてGemfileの記述場所が違う可能性もあります。(私も間違えていました)
Gemfile
# 開発環境とテスト環境で使用するgem
group :development, :test do
gem 'byebug', platforms: %i[mri mingw x64_mingw]
gem 'rspec-rails'
gem 'factory_bot_rails'
# 本来はここに'pry-rails'と'pry-byebug'を定義する
end
# 開発環境のみ使用するgem
group :development do
gem 'pry-rails'
gem 'pry-byebug'
end
rspecはテスト環境で使用しているので、group :development
の方に定義してしまうとbinding.pryは未定義のメソッドだよ!
とエラーが出てしまいます。
なのでgemを導入する時は、役割を理解してそれぞれのグループに配置する必要がありますね!