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

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

ただいまの
回答率

87.49%

商品モデルのテストコードが成功しない

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,922

score 12

furimaの商品情報の入力機能をテストしたいのですが、以下のようなエラーメッセージがターミナルにて出力され、モデルの単体テストコードがうまくいきません。どうもFactoryBotクラスに原因がありそうなのですが、調べてもこの類のものは出てきませんでした。どなたかわかる方お願いします。

      NoMethodError:
        undefined method `category_id=' for #<Item:0x00007fe1f844ee18>
        Did you mean?  category=
                       category_was

以下ファイルになります。

spec/factories/items.rb

FactoryBot.define do
  factory :item do
    image         {Faker::Lorem.sentence}
    name          {"名前"}
    introduction    {"説明"}
    price           {2000}
    item_condition_id  {1}
    postage_id         {1}
    prefecture_id      {1}
    prepare_id         {1}
    category_id        {1}
    association :user
  end
end
spec/models/item_spec.rb

require 'rails_helper'

RSpec.describe Item, type: :model do
  before do
    @item = FactoryBot.build(:item)
  end
  describe '商品情報入力' do
    context '商品情報入力がうまくいかない時' do
      it '全ての値が正しく入力されていれば出品できること' do
        expect(@item).to be_valid
      end
    end
    context '商品情報の入力がうまく行かない時' do
      it 'imageが空だと出品できない' do
        @item.image = nil
        @item.valid?
        expect(@item.errors.full_messsages).to include("Image can't be blank")
      end
      it 'nameが空だと出品できない' do
        @item.name = nil
        @item.valid?
        expect(@item.errors.full_messages).to include("Name can't be blank")
      end
      it 'introductionが空だと出品できない' do
        @item.introduction = nil
        @item.valid?
        expect(@item.errors.full_messsages).to include("Introduction can't be blank")
      end
      it 'categoryが未選択だと出品できない' do
        @item.category = 0
        @item.valid?
        expect(@item.errors.full_messsages).to include("Category can't be blank")
      end
      it 'item_conditionが未選択だと出品できない' do
        @item.item_condition = 0
        @item.valid?
        expect(@item.errors.full_messsages).to include("Item_condition can't be blank")
      end
      it 'postageが未選択だと出品できない' do
        @item.postage = 0
        @item.valid?
        expect(@item.errors.full_messsages).to include("Postage can't be blank")
      end
      it 'prefectureが未選択だと出品できない' do
        @item.prefecture = 0
        @item.valid?
        expect(@item.errors.full_messsages).to include("Prefecture can't be blank")
      end
      it 'prepareが未選択だと出品できない' do
        @item.prepare = 0
        @item.valid?
        expect(@item.errors.full_messsages).to include("Prepare can't be blank")
      end
      it 'priceが空だと出品できない' do
        @item.price = nil
        @item.valid?
        expect(@item.errors.full_messsages).to include("Price can't be blank")
      end
      it 'priceが全角数字だと出品できない' do
        @item.price = "2000"
        @item.valid?
        binding.pry
        expect(@item.errors.full_messsages).to include("")
      end
    end
  end
end
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • maisumakun

    2020/12/07 08:22

    ・テスト対象となるモデルのソースコード、そしてテーブル構造はどのようなものでしょうか?
    ・テスト用のデータベースもきちんとmigrateしましたか?

    キャンセル

  • murohi-08

    2020/12/07 14:33

    マイグレーションファイルを修正しました。itemsテーブルのcategoryのカラムだけidをうっかりつけていませんでした。
    失敗したときのテストコードはうまく実行できたのですが、成功したときの場合が今度はうまくいきません。
    以下のようなエラーが出ました。↓
    Failure/Error: expect(@item).to be_valid
    ご教授いただければ幸いです。

    キャンセル

回答 1

checkベストアンサー

0

成功したときのコードが無いので、恐らくですが、

      it 'categoryが未選択だと出品できない' do
        @item.category = 0
        @item.valid?
        expect(@item.errors.full_messsages).to include("Category can't be blank")
      end


      it 'categoryが未選択だと出品できない' do
        @item.category_id = 0
        @item.valid?
        expect(@item.errors.full_messsages).to include("Category can't be blank")
      end


ではないでしょうか?
お確かめ下さい。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る