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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

1748閲覧

RSpecでFactoryBotを使うとバリデーションエラーが出る

da_ast

総合スコア7

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2020/11/03 12:11

編集2020/11/03 12:15

前提・実現したいこと

RSpecでテストを書いています。FactoryBotでユーザーを生成しているのですが、テストを実行すると実行した範囲内で一番最初のユーザーだけがメールアドレスが重複しているとのバリデーションエラーが発生してしまうので解決方法が知りたいです。

発生している問題・エラーメッセージ

Failure/Error: let(:user) { FactoryBot.create(:user) } ActiveRecord::RecordInvalid: バリデーションに失敗しました: メールアドレスはすでに存在します

該当のソースコード

ファクトリではemailを重複させないようにとシークエンスを使っています。

factory

1FactoryBot.define do 2 factory :user do 3 name { "factory" } 4 sequence(:email) { |n| "factory#{n}@example.com" } 5 password { "password" } 6 password_confirmation { "password" } 7 end 8end

テストコードは例としてspec/system/login_spec.rbを記載します。
テストファイルはloginやらeditやら複数ありますが、どのファイルでも下に記載したようにlet(:user) { FactoryBot.create(:user) }でユーザーをdbに作ってログインさせています。

login

試したこと

どんな範囲でテストしても、FactoryBot.create(:user)でユーザーを生成したテストの中で、最初のテストだけがメールアドレス重複のバリデーションエラーになります。

例1. spec/systemの範囲をテストすると一番上のedit_spec.rbの最初のテストだけエラー、他はパス
例2. spec/system/login_spec.rbだけをテストするとlogin_spec.rbの最初だけエラー、他はパス

以上のような具合です。

いろいろ調べた結果、Database Cleanerというgemを使ってテスト実行時に作成したデータをテスト終了時に削除すれば良いのではないかと思ったのですが、さらに調べたところFeature specとは違いSystem specではDatabase Cleanerなどを使ってロールバックを手動で設定する必要がないとのことだったので行き詰まってしまいました。
なのでおそらく原因は、そもそもFactoryBotの使い方を間違っているか、テストファイルの記述が間違っているのだと思っています...

それともこのようなテストをする場合はFakerを使うべきなのでしょうか...?

補足情報(FW/ツールのバージョンなど)

環境は以下の通りです。
Mac OS Catalina 10.15.7
Ruby 2.7.1
Rails 6.0.3.3
RSpec 3.9
Factory_Bot 6.1.0

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

gitのブランチを切り替えてまた戻ってきたら全部テストがパスするようになりました...
一応解決しましたが何が原因だったのでしょうか...

投稿2020/11/03 12:40

da_ast

総合スコア7

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問