【RSpec】投稿機能においてカテゴリーの選択・値の保存の際の注意点

皆様こんにちは、もしくははじめまして。IDEです。
今回の記事では、アソシエーションで組んだカテゴリーの値について、RSpecでことごとく苦しんだので記事として残しておきます。
今回はいつもより備忘録感が強めかと思いますが、もしどなたかの参考になれば幸いです。

目次

  1. コントローラー単体テスト/ActiveRecord::NotNullViolation
  2. 結合テスト/ラジオボタンの値が保存できない
  3. まとめ
  4. 参考文献

コントローラー単体テスト/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でも、個人の契約でも)からヒントをいただくのも一つの手ではないでしょうか。
事前リサーチはもちろん怠らわずに!


参考記事

今回のエラー解決に当たり、以下の記事を参考にさせていただきました。
ありがとうございました。

コントローラー単体テスト/ActiveRecord::NotNullViolation

  • 【Rails】RSpec(Capybara)で使うvisitはit句の中でしか使えない?(調査中) - ヨージとプログラミング
  • RSpec + Capybara でラジオボタン/セレクト/チェックボックスのフォーム要素をテスト
  • ActiveRecord::NotNullViolation in Deviseエラー - Qiita

    結合テスト/ラジオボタンの値が保存できない

  • 【Rails】RSpecとCapybaraのFeature
  • 使えるRSpec入門・その4「どんなブラウザ操作も自由自在!逆引きCapybara大辞典」 - Qiita
  • RSpec - フィーチャスペックを導入する - fv17の日記 - Coding Every Day