1
0

More than 1 year has passed since last update.

外部キーのテストコードが上手くいかない

Last updated at Posted at 2022-02-22

簡易的なフリマアプリを作成中。

単体テストコードにて、エラーが発生。
下記ターミナル内のエラー内容。

ターミナル

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 のコードを見ると、確かにアソシエーションの記述がある。
しかもその下にはバリデーションの記述まである。

物は試しで該当のコードに追記してみる。

models/order_delivery.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時間かかりました・・・
失敗は今しかできないと前向きに捉えて、明日からまた学習に励みます!

1
0
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
1
0