RspecとFactoryBotを使用したテストで予期せぬエラーがでた。
railsで商品売買アプリを自主制作しており、現在Orderモデルに対するバリデーションの単体テストを書いています。そこでorderモデルのカラムの一つaddressカラムのエラーがどうも解除できません。
bundle exec rspec ./spec/models/order_spec.rb後のターミナルのエラー文
Order #create id,zipcode,prefecture,city,address,building,seller_id,buyer_id,item_id,reciever_last_name,receiver_first_nameがあれば登録できること (FAILED - 1) Failures: 1) Order#create id,zipcode,prefecture,city,address,building,seller_id,buyer_id,item_id,reciever_last_name,receiver_first_nameがあれば登録できること Failure/Error: order = build(:order) NoMethodError: undefined method `address=' for #<Order:0x00007fa1c5ef0330> # ./spec/models/order_spec.rb:11:in `block (3 levels) in <top (required)>' Finished in 0.76696 seconds (files took 4.64 seconds to load) 1 example, 1 failure Failed examples: rspec ./spec/models/order_spec.rb:10 # Order#create id,zipcode,prefecture,city,address,building,seller_id,buyer_id,item_id,reciever_last_name,receiver_first_nameがあれば登録できること
FactoryBotのorders.rbの記述
FactoryBot.define do factory :order do zipcode {'998-9909'} prefecture {'Fukuoka'} city {'Fukuoka'} building {'Fukuoka000'} address {'fukuoka'} receiver_last_name {'test'} receiver_first_name {'test'} buyer_id {'1'} seller_id {'2'} item end end
order_spec.rb内の記述
require 'rails_helper' describe Order do describe '#create' do before do @item = create(:item) end it 'id,zipcode,prefecture,city,address,building,seller_id,buyer_id,item_id,reciever_last_name,receiver_first_nameがあれば登録できること' do order = build(:order) expect(order).to be_valid end end end
一応モデル内のバリデーションは以下になります。
class Order < ApplicationRecord belongs_to :item belongs_to :seller, class_name: 'User', optional: true, foreign_key: true belongs_to :buyer, class_name: 'User', optional: true, foreign_key: true validates :receiver_last_name, presence: true validates :receiver_first_name, presence: true validates :zipcode, presence: true validates :prefecture, presence: true validates :city, presence: true validates :address, presence: true end
疑問に思うこと
- ターミナルで表示されるのはNoMethodError:undefined method `address=' for #Order:0x00007fa1c5ef0330でaddress=が定義されていませんとなっています。しかしFactoryBotに記述しているのはaddressであってaddress=ではありません。これはどういうことなのでしょうか?
試したこと
- 一度FactoryBotの中のaddressの記述を消してテストをしてみると上記のエラー文の
NoMethodError:undefined method `address=' for #<Order:0x00007fa1c5ef0330>
ここが
NoMethodError:undefined method `address' for #<Order:0x00007fa1c5ef0330>
と=がなくなった状態になります。FactoryBotを何も書いていないのに上記のエラー文が出てしまうのはどういうことかわからずに困っています。
どうかアドバイスを頂けますと助かります。お願いします。
追記
schema.rbで確認しましたが、ordersテーブルにストリング型でしっかりとaddressが存在する状態です。
create_table "orders", options: "ENGINE=InnoDB DEFAULT CHARSET=utf8", force: :cascade do |t| t.bigint "seller_id", null: false t.bigint "buyer_id", null: false t.bigint "item_id", null: false t.string "receiver_last_name" t.string "receiver_first_name" t.string "zipcode", null: false t.string "prefecture", null: false t.string "city", null: false t.string "address", null: false t.string "building" t.datetime "created_at", null: false t.datetime "updated_at", null: false t.index ["buyer_id"], name: "index_orders_on_buyer_id" t.index ["item_id"], name: "index_orders_on_item_id" t.index ["seller_id"], name: "index_orders_on_seller_id"
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/09 07:17
2020/07/09 07:42
2020/07/09 11:35
2020/07/09 11:38