rspec を実行する信頼性の高い継続的インテグレーション サーバーをセットアップしようとしています。私はこの回答を読みました。実際に db:reset を実行すると、テストを実行するのに適した状態になっているようです。実際、db:reset を実行してから、cli で rake spec を実行すると、テストが実行されます。
ただし、次のように、両方を行う 1 つの rake タスクを作成すると:
desc 'Run all tests, used by Jenkins CI'
task :run => [ 'db:reset' ] do
Rake::Task["spec"].invoke
end
テストが実行されるまで、データベースは空です。これは、rake:spec が以下を呼び出しているためと思われます。
** Invoke db:test:prepare (first_time)
** Invoke db:abort_if_pending_migrations (first_time)
** Invoke environment
** Execute db:abort_if_pending_migrations
** Execute db:test:prepare
** Invoke db:test:load (first_time)
** Invoke db:test:purge (first_time)
** Invoke environment
** Execute db:test:purge
** Execute db:test:load
** Invoke db:schema:load
** Execute spec
私が正しく読んでいれば、保留中の移行がある場合は (2 行目) 中止されます。その後、最終的に db:schema:load が再び実行され、スキーマ rb からデータベースがロードされます...これは既に行っています。また、データベースを再消去する場合、移行が適用されなかった場合に中止される理由が特に不明確になります。
さらに悪いことに、私の場合、users テーブルが存在しないため、spec タスクが最初に実行するのは bail です... これは schema.rb で定義されています (この時点で 2 回ロードされています)。
私が誤解しているアイデアはありますか?