0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

コメント機能 モデル単体テスト 実装

Posted at

今回、実装時に正常にコメント機能モデル単体テストが起動しなく、悩んだため備忘録のためアウトプット。

factory_bot_rails
faker

上記二つのjemは導入済みを前提で進めていく。

正常系のテストの際にエラーがでた。

Comment
  #create
    コメント投稿できる場合
      コメント入力済みあれば投稿できる (FAILED - 1)
    投稿できない場合
      コメントが空では投稿できない
      ユーザーが紐付いていなければコメントできない

Failures:

  1) Comment#create コメント投稿できる場合 コメント入力済みあれば投稿できる
     Failure/Error: expect(@comment).to be_valid
       expected #<Comment id: nil, user_id: nil, post_id: nil, comment_text: "コメント", created_at: nil, updated_at: nil> to be valid, but got errors: Postを入力してください
     # ./spec/models/comment_spec.rb:11:in `block (4 levels) in <top (required)>'

Finished in 0.29859 seconds (files took 1.59 seconds to load)
3 examples, 1 failure

Failed examples:

rspec ./spec/models/comment_spec.rb:10 # Comment#create コメント投稿できる場合 コメント入力済みあれば投稿できる

エラーを読みとくにコメントでは無く、投稿が空になっているためにエラーが出ていると認識。

余談
まだプログラミング学習を始めて2ヶ月ということもあるが、エラーとの格闘が多くなってきているに比例して、エラーを読み解く力も日々ついてきていると実感している。

今回実装中のコードが下記。

comment_spec.rb

require 'rails_helper'

RSpec.describe Comment, type: :model do
  before do
    @comment = FactoryBot.build(:comment)
  end

  describe '#create' do
    context 'コメント投稿できる場合' do
      it 'コメント入力済みあれば投稿できる' do
        expect(@comment).to be_valid
      end
    end

    context '投稿できない場合' do
      it 'コメントが空では投稿できない' do
        @comment.comment_text = ''
        @comment.valid?
        expect(@comment.errors.full_messages).to include("Comment textを入力してください")
      end
      it 'ユーザーが紐付いていなければコメントできない' do
        @comment.user = nil
        @comment.valid?
        expect(@comment.errors.full_messages).to include("Userを入力してください")
      end
    end
  end
end

comments.rb

FactoryBot.define do
  factory :comment do
    comment_text { 'コメント' }
    association :user
  end
end

ここでシンプルな凡ミスをしていることに気づく。
コメントをするのに元である、post(投稿)に対してassociationが組めていない。

そこで、comments.rb

FactoryBot.define do
  factory :comment do
    comment_text { 'コメント' }
    association :user
    association :post #追加
  end
end

association :post #追加

上記を追加することにより、正常に単体テストが実装された。

シンプルな凡ミスであったが、エラーの解読力が日に日に上がっているということも実感でき、5分立たないうちに気づけた。

以前ではもっと多く時間を使っていたと思う。

エラーと向き合えば自然と答えが出せるんだということにも改めて気づけ、今後はこのような記述ミスをなくして行けたらと思う。

ただ、まだまだわからないことも多いので日々勉強あるのみ。

エラーが出たら冷静に対応して行けたらと思う。

ご覧いただきましてありがとうございました。

example等で「このテストもやった方がいいよ」等のご指摘もありましたら、是非アドバイスいただけましたら幸いです。

宜しくお願いします。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?