Rails 3チュートリアル第11章「検証失敗:メールが既に取得されている」エラー
-
24-10-2019 - |
質問
Ruby on Railsチュートリアルの第11章で私の問題が発生しました ここ.
このRSPECエラーが見られていました:
Failure/Error: :user => Factory(:user, :email => Factory.next(:email)))
ActiveRecord::RecordInvalid:
Validation failed: Email has already been taken
最初に user_spec.rb
その後 micropost_spec.rb
. 。かなり困惑していました。 AutoTestがRSPECを実行するたびに、工場の声明が新鮮なテストDBでユーザーを生成していると思いました。 Master BranchからGITでソースファイルをチェックアウトし、再試行しましたが、同じエラーが表示されました。したがって、コードではなく、DBの内容に関連する疑いがあります。
だから、私は次のことをしました:
restarted "rails s"
restarted autotest
rake db:reset
rake db:migrate
rake db:test:prepare
rake db:populate
...そしてそれはすべて緑になりました。 RSPECテストが合格しました。
もっと「ポイント」解決策があるかもしれませんが、私はこれがうまくいったことに興奮しました。それが他の誰かを助けることを願っています。私は、私のテスト/開発が何らかの形でDBに何かを予期しないものに追加したと結論付けています。上記の手順は、第11章の終わり近くに自分自身を新鮮なDBにする良い方法だと思います。
これを解決するためのより直接的な方法はありましたか?エラーは、気付かずに対処した他の問題を示していますか? RSPECを実行しても、毎回新しいテストDBを保証しないと考えています。それは間違った仮定ですか?
解決
第9.4章の直後に統合テストに問題がありました。私のコントローラーテストとリクエスト統合テストは、「メールが既に取得されている」というメッセージで爆発しました。
私が学んだこと RailStutorial-第8.4.3章 - 統合テストでユーザーを追加した後にクリアしないデータベース 統合テスト後にクリーンアップするために何かをする必要があるということです。なぜなら、ユニットテストとは異なり、彼らは自分自身の後にクリーンアップしない可能性があるからです。
そこに提示されたソリューションは、を使用することでした Databasecleaner GEM、その実装は、リンクされた質問でも説明されています。
統合テスト後にクリーンアップのための戦略を実装しない場合、テストスイートを実行するたびにDBをクリーンアップするために「ショットガン」ソリューションを使用する必要があると思います。間違いなく楽しくありません。
他のヒント
これは私にとってはうまくいきます:
bundle exec rake db:test:prepare
チュートリアルもあります。
私にとって、問題はスポークを走っているように見えました。再起動した後、必要なだけテストを実行できます。
ファイルに追加されました factories
sequence(:email) {|n| "person#{n}@example.com" }
私の場合、問題は等しい電子メールにありました
factory :user
と
factory :user_with_additional_options