4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

RSpecでbinding.pryを使おうとしたらなぜが止まらない現象について(初学者向け)

Posted at

現象内容

gempry-railspry-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ブロックが呼び出されていたので、エラーが発生してもすべてのコードを読み込んでくれていると勘違いしていました。
通常だとエラーが発生した時点ですぐにエラー画面が表示するので、「ここで処理が止まっているんだな」と視覚的にわかりやすいのですが...
今回の現象でエラーが出てしまった時の挙動について、少し理解が深まったかなと思います。

補足:Gemfileで定義する場所について

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を導入する時は、役割を理解してそれぞれのグループに配置する必要がありますね!

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?