今回、実装時に正常にコメント機能モデル単体テストが起動しなく、悩んだため備忘録のためアウトプット。
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等で「このテストもやった方がいいよ」等のご指摘もありましたら、是非アドバイスいただけましたら幸いです。
宜しくお願いします。