簡易的なフリマアプリを作成中。
単体テストコードにて、エラーが発生。
下記ターミナル内のエラー内容。
Failures:
  1) OrderDelivery 購入者情報の保存 内容に問題がある場合 userが紐ついていなければ購入できない
     Failure/Error: expect(@order_delivery.errors.full_messages).to include( "" )
       expected [] to include ""
     # ./spec/models/order_delivery_spec.rb:81:in `block (4 levels) in <top (required)>'
  2) OrderDelivery 購入者情報の保存 内容に問題がある場合 itemが紐ついていなければ購入できない
     Failure/Error: expect(@order_delivery.errors.full_messages).to include( "Item must exist" )
       expected [] to include "Item must exist"
     # ./spec/models/order_delivery_spec.rb:86:in `block (4 levels) in <top (required)>'
order_deliveryモデルとuserモデル、itemモデルをそれぞれ外部キーとして設定しているが、なぜか紐ついていない様子。
(ローカルサーバーでは上手くいっているのに・・・)
expected [] to include
上記のエラー文は過去にも見たことがある。その時はバリデーションで記述したエラーメッセージと、テストコードで記述したエラーメッセージの内容が異なっていた事が原因だった。
("can't be blank" を "can't be blanc" とスペルミスしたことでエラーになった)
今までも他のアプリで外部キーのテストコードは何回もしたが、バリデーションにエラーメッセージを記述した覚えはない。
google先生に聞いてみても、期待する回答は返ってこなかった。
もしかしたら、変数が間違っている?
何度もコードを読み返すが、間違っている様子もない。
そんな時、ふと思い付く。
「あれ?そういえばimageも外部キーやでな?」
models/item.rb のコードを見ると、確かにアソシエーションの記述がある。
しかもその下にはバリデーションの記述まである。
物は試しで該当のコードに追記してみる。
class OrderDelivery
  include ActiveModel::Model
  attr_accessor :token
  attr_accessor :post_code, :address_id, :municipalities, :house_number, 
                :building, :tel, :order_id, :user_id, :item_id
  with_options presence: true do
    validates :user_id  # 追記
    validates :item_id    # 追記
    validates :token
    validates :post_code, format: {with: /\A[0-9]{3}-[0-9]{4}\z/, message: "input correctly"}
    validates :municipalities
# 以下省略
    
成功!!
でもなんで?
しっかりとカリキュラムに書いていました。
Formオブジェクトで実装したクラスはアソシエーションを定義することはできないため、バリデーションを行う事ができません。そのため、use_idに対してバリデーションを新たに設定します。
エラー解決に2時間かかりました・・・
失敗は今しかできないと前向きに捉えて、明日からまた学習に励みます!
