【RSpec】投稿機能においてカテゴリーの選択・値の保存の際の注意点
皆様こんにちは、もしくははじめまして。IDEです。 今回の記事では、アソシエーションで組んだカテゴリーの値について、RSpecでことごとく苦しんだので記事として残しておきます。 今回はいつもより備忘録感が強めかと思いますが、もしどなたかの参考になれば幸いです。
目次
コントローラー単体テスト/ActiveRecord::NotNullViolation
not null制約がかかっているのはずのnameカラムが空ですよ〜〜と出る。 投稿機能のnameは入っているのになぜ…??? 詳細の内容はコチラ
解決方法
FactoryBotの記述内容を修正
FactoryBot.define do factory :category do name { 'アレンジレシピ' } #id {1}と記述していたのを修正 end end
解決までの道のり
まず、値の生成をFactoryBotを使わずに記述
before do @user = User.create(name:'sample', email:"aaa@yahoo.com", password:"sample00", password_confirmation:'sample00') @deli = Deli.create(name:'test', text:'test', category_id:1, supermarket_id:1, user_id:1)
上記でテストコードを実行し、成功すればFactoryBotに、成功しなければRSpecに問題があると考えられる。 →テストが成功したのでFactoryBotに問題があることが判明。 FactoryBotの各記述(アソシエーションを組んでいるものも)を確認したところ、これでは???となりました。 ちなみに、アソシエーションでつながっているので例えカテゴリーの値を生成しないとしてもファイルは作らないとエラーが発生してしまいます⚠︎
結合テスト/ラジオボタンの値が保存できない
chooseメソッドでラジオボタンを選択しているにも関わらず、"Category must exist"と出てきます。
Delis 投稿ができる時 From: /Users/user/projects/delishare/app/controllers/delis_controller.rb:16 DelisController#create: 14: def create 15: @deli = Deli.new(deli_params) => 16: binding.pry 17: if @deli.save 18: redirect_to root_path 19: else 20: render :new 21: end 22: end [1] pry(#<DelisController>)> @deli => #<Deli:0x00007fddd750d180 id: nil, name: "test", text: "test", supermarket_id: 14, user_id: 109, category_id: 2, created_at: nil, updated_at: nil> [2] pry(#<DelisController>)> @deli.valid? => false [3] pry(#<DelisController>)> @deli.errors.full_messages => ["Category must exist"]
詳細の内容はコチラ
解決方法
テスト環境にカテゴリーテーブルの値を入れましょう!!!
develop環境でのカテゴリーの値はseedで入れていたため、テスト環境にもrake db:seed RAILS_ENV=test
コマンドを実行して値を流します。
このとき、IDがdevelop環境と違う場合があるので必ず合わせましょう。
まとめ
今回、両エラーで共通して聞かれたのがテスト環境に値は入っていますか?でした。 今更ですがテストを実行する際はテスト環境上で実行されるため、必ずdevelop環境と同じ環境になっているか確認することが大切です! テスト実行前やエラー発生時にsequel Pro等で確認しながら進めましょう。
今回のエラーの解決にあたり、teratailを利用しました。 それでも解決しなかったため、sisterでだむはさんのメンタープランを購入し、一緒に解決していただきました。 (1回目はCodePolarisのコミュニティで質問をし、解決へのヒントをいただきました。今思えばコミュニティで質問するような軽い内容じゃないしちゃんとお金をお支払いしてお教えいただくような案件だな…と反省😓) 今までカリキュラムで学習した内容ならともかく、独学ですべてエラーまで解決するとなるとかなり難しいとなりました。 しっかりと調べた上でわからないこともまだたくさん出てくるかと思うので、そういった際にはメンターの方々(私が今回利用したsisterでもMENTAでも、個人の契約でも)からヒントをいただくのも一つの手ではないでしょうか。 事前リサーチはもちろん怠らわずに!
参考記事
今回のエラー解決に当たり、以下の記事を参考にさせていただきました。 ありがとうございました。