テストが実行される前にテスト データベースをクリアするためのレーキ タスク db:test:prepare があります。これは、いくつかのコア ライブラリの一部として定義されている test、test:units、および test:functionals タスクの魔法のような依存関係のようです。
test:units または test:functionals のいずれかを単独で実行すると、最初に db:test:prepare が実行され、テストが成功します。しかし、デフォルトのテスト タスクを実行すると、その間にデータベースがリセットされなかったため、2 番目のテスト スイートは失敗します。
調べてみると、rake の依存関係が既に 1 回実行されている場合はスキップされることtask :a => :pre
がわかりましたtask :b => :pre
。task :c => [:a, :b]
rake c
:pre, :a, :b
:pre, :a, :pre, :c
最終的に、新しいタスクを作成することで、必要な動作が得られました。
namespace :test do
task :all do
Rake::Task['test:units'].invoke
Rake::Task['db:test:prepare'].execute
Rake::Task['test:functionals'].invoke
end
end
これを行うより良い方法はありますか?または、依存関係が必要であることを宣言する方法などはありますか? Rake::Task には #reenable メソッドがあり、実行の最後に「prepare」タスク自体を再有効化して、それに依存する 2 番目のタスクが発生したときに再び呼び出されるようにするなど、回避策を可能にすることを望んでいました。 、しかし、そのようには機能しないようです。