簡易的なフリマアプリを作成中。
単体テストコードにて、エラーが発生。
下記ターミナル内のエラー内容。
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時間かかりました・・・
失敗は今しかできないと前向きに捉えて、明日からまた学習に励みます!