前提・実現したいこと
FactoryBotについて問題があって困っています。
RSpecのシステムスペックでエラーが出て、その原因がわかりません。
発生している問題・エラーメッセージ
RSpecのSystem specで正常にログインできているかのテストをしようとした際に問題が発生しました。
最初にbefore
でFactoryBot.create
でユーザーデータをdbに作っておき、ログイン手順のテストを進めようとしたところエラーが発生しました。
test
1 2require 'rails_helper' 3 4RSpec.describe "User login", type: :system do 5 before do 6 @user = FactoryBot.create(:user) 7 end 8. 9. 10. 11
error
1Failure/Error: @user = FactoryBot.create(:user) 2 3 ActiveRecord::RecordInvalid: 4 バリデーションに失敗しました: メールアドレスはすでに存在します
試したこと
specディレクトリ内でユーザーのfactoryは一つしか作っていません。
rails console --sandbox
で確認したところ、重複メールアドレスはなかったのですが、コンソールを終了してロールバックされた時にユーザーのidに異常があることを発見しました。
コンソールで初めにFactoryBot.create(:user)
でユーザーを作成したところidは10となり、ロールバックして再度FactoryBot.create(:user)
でユーザーを作成したところidは11となりました。
User.all
で全ユーザーを表示すると最初は1...10となりましたが、ロールバックして再度ユーザー作成した時は1...9, 11となってid=10がなくなり、再度行うと1...9, 12となり、10と11がなくなります。
つまりrails console --sandbox
において過去にFactoryBot.create(:user)
で作成したユーザーのidだけ抜け落ちるようになっていました。
どこかにFactoryBot.create(:user)
で作成したデータが残っていてそのためにRSpecではバリデーションエラーが出たのかな?とは思ったのですが、初学者ゆえこの原因が何でどこに問題があるのかなど見当がつきません。
FactoryBotでシークエンスを使えばユニークなメールアドレスが生成でき、このテストはパスできるとは思いますが、明らかな不具合があると分かっている以上ここで解決しておきたいです。
どなたかこの問題を解決するために知恵をお貸しいただけませんでしょうか。
補足情報(FW/ツールのバージョンなど)
環境は以下の通りです
Mac OS Catalina 10.15.7
Ruby 2.7.1
Rails 6.0.3.3
FactoryBot 6.1.0
factoryは以下の通りです。
factory
1FactoryBot.define do 2 factory :user do 3 name { "factory_user" } 4 email { "factory@example.com" } 5 password { "password" } 6 password_confirmation { "password" } 7 end 8end
回答1件
あなたの回答
tips
プレビュー