多くのカスタム Rake タスクに依存する ROR アプリを開発しています。
それらをテストする最良の方法は何ですか?
Rake タスクをテストするのは非常に困難です。最も簡単な解決策は、ロジックを適切なモデルのメソッドに移動することです。次に、それをテストして、rake タスクからメソッドを呼び出すだけです。
何かのようなもの:
def execute_rake(file,task)
require 'rake'
rake = Rake::Application.new
Rake.application = rake
Rake::Task.define_task(:environment)
load "#{Rails.root}/lib/tasks/#{file}"
rake[task].invoke
end
あなたの仕様で:
execute_rake("tags.rake","tags:popular")
これは別のSOの質問でかなりよくカバーされています
ここで要約して繰り返しますが、rake タスクをテストしようとしないことをお勧めします。テストするコードをクラス、モデル、または lib 関数に抽出し、そこでテストします。次に、 rake を使用して関数を呼び出し、依存関係を管理します。
私はPivotalLabs のやり方が一番好きです。ただし、アプリで次のようにコードを一般化して変更しました。
# file: spec/tasks/my_rake_file_spec.rb
require 'spec_helper'
require 'rake'
describe 'my_rake_file.rake' do
before :all do
Rake.application.rake_require 'tasks/my_rake_file'
Rake::Task.define_task(:environment)
end
let(:run_rake_task) {
Rake::Task[task_name].reenable
Rake.application.invoke_task task_name
}
describe 'my_task_name' do
let(:task_name) { "my_task_name" }
it "creates 10 cars" do
run_rake_task
Car.count.should == 10
end
end
end
また、my_rake_file.rake のコードの重労働をモジュールに抽出し、lib/ に保存しました。