はじめに
RSpecを回した時だけモデルオブジェクトが作成されない問題が発生し、
ただただ凡ミスですがなかなか気づかず時間を溶かしてしまったため自戒の念を込めて・・・
概要
- 論理削除のため"discard"を使用
- RSpecでダミーデータを作成するため、FactoryBotを使用
-
let(:user) {FactoryBot.create(:user)}
のようにテストデータを定義
発生した問題
デバッグしuserを確認するとオブジェクトは作られているのに、
User.firstなどで参照した際に空となっているため期待値を得られない。
原因
結論、FactoryBotのdiscarded_atに初期値を入れてしまっていたことが原因と思われます。
# spec/factories/users.rb
FactoryBot.define do
factory :user do
nickname {"test"}
email {"test@gmail.com"}
password {"12345678"}
password_confirmation {"12345678"}
discarded_at {"2023-07-01 03:12:01"} # 問題の箇所
end
end
修正後
# spec/factories/users.rb
FactoryBot.define do
factory :user do
nickname {"test"}
email {"test@gmail.com"}
password {"12345678"}
password_confirmation {"12345678"}
discarded_at {nil} # nilに修正
end
end
これでモデルオブジェクトが正常に保存され参照できるようになったの、
テストが期待通り通るようになりました。
最後に
letで定義する際にdiscarded_at
をnilにしても解決すると思いますが、
そもそもdiscarded_at
に初期値を持たせること自体普通ではないので、
nil
にするのが正解だと思います。
めちゃくちゃ凡ミスだった。反省。