質問

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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top