質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

2回答

1835閲覧

Rspecでno method errorを出る。

atsushi0804

総合スコア1

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/07/08 18:35

編集2020/07/09 07:15

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"

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

症状からの第一感では DBのtable orders に addressというcolumnがない、という感じです。
migration1やdb/schema.rbで確認してください。

投稿2020/07/08 21:52

winterboum

総合スコア23376

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

atsushi0804

2020/07/09 07:17

追記でschema.rbの中身をあげさせていただきましたが、テーブルにはしっかりとaddressカラムが存在する形になります。mysqlで確認しても存在しております。 この状況だと何か他に問題点はありますでしょうか?
winterboum

2020/07/09 07:42

address=  が無いというのが出たのは address {'fukuoka'} によって、 order.address = 'fukuok' が実行されるからです。 address= は ActiveRecordがDBと接続した時にtable ordersのschemaを読んで動的に定義します。 さて、、、、 mysqlで確認したdatabaseは、developmentのものではないですか? testのものでも有りますか?
atsushi0804

2020/07/09 11:35

コメントありがとうございます! 確認しましたところ、developmentもtestの方でもどちらでもaddressというカラムが存在する状況でした。スペル間違いもない状況です。
atsushi0804

2020/07/09 11:38

今rails db:migrate:resetをして見たら理由がわからないのですが無事にテストが通りました。。。
guest

0

一応解決しました!

rails db:migrate:resetを実行した後にテストを実行したら無事に通りました。。。
どうしてリセットをしたら通ったのかはわかりませんのでもしどちら様か可能性のある理由があれば教えていただけると助かりますが、一応自己解決とさせていただきます!
winterboumさんは回答どうもありがとうございます!

投稿2020/07/09 11:43

atsushi0804

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問