9

私の問題は、RubyonRailsチュートリアルの第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を実行するたびに、ファクトリステートメントが新しいテストデータベースでユーザーを生成していると思いました。gitを使用してマスターブランチからソースファイルをチェックアウトして再試行しましたが、同じエラーが発生しました。したがって、コードではなく、dbの内容に何らかの形で関連しているのではないかと思いました。

だから、私は次のことをしました:

restarted "rails s"  
restarted autotest  
rake db:reset  
rake db:migrate  
rake db:test:prepare  
rake db:populate  

...そしてそれはすべて緑になりました。rspecテストに合格しました。

もっと「要点」の解決策があるかもしれませんが、私はこれがうまくいったことに興奮しました。それが他の誰かを助けることを願っています。私のテスト/開発は、どういうわけか予期しない何かをデータベースに追加したと結論付ける必要があります。上記の手順は、第11章の終わり近くで新しいデータベースを作成するための良い方法だと思います。

これを解決するためのより直接的な方法はありましたか?エラーは、気付かずに対処した他の問題を示していますか?rspecを実行しても、毎回新しいテストデータベースが保証されるわけではないと思います。それは間違った仮定ですか?

4

5 に答える 5

12

9.4章の直後に統合テストで問題が発生しました。すべてのコントローラー テストとリクエスト統合テストが「メールは既に取得されています」というメッセージで失敗しました。

RailsTutorial - 章 8.4.3 - 統合テストでユーザーを追加した後にデータベースがクリアされないことをテストすることから学んだことは、統合テスト後にクリーンアップするために何かをする必要があるということです。

そこで提示された解決策は、DatabaseCleaner gem を使用することでした。その実装については、リンクされた質問でも説明されています。

統合テスト後にクリーンアップするための戦略を実装しないと、テスト スイートを実行するたびに DB をクリーンアップするために「ショットガン」ソリューションを引き続き使用する必要があると思います。絶対に楽しくない。

于 2011-04-24T03:32:26.770 に答える
4

これは私のために働く:

bundle exec rake db:test:prepare

チュートリアルにもあります。

于 2012-11-17T00:03:57.763 に答える
2

私にとって、問題は Spork を実行しているように見えました。再起動後、必要な回数だけテストを実行できます。

于 2013-03-30T20:17:57.300 に答える