Rake タスクをテストするとき、テストコード内で #invoke
で呼び出すと、二回目の実行時に Rake タスクが実行されません。
describe 'hoge' do
before(:all) do
@rake = Rake::Application.new
Rake.application = @rake
Rake.application.rake_require("hoge", ["#{Rails.root}/lib/tasks"])
Rake::Task.define_task(:environment)
end
describe "rake hoge" do
context "Rake タスク実行後" do
before do
@rake["book:dismissed_suppliers"].invoke
end
it "hoge 一回目" do
# Rake タスクが実行される
end
it "hoge 二回目" do
# Rake タスクが実行されない
end
end
end
end
これは仕様のようです。
もう一度実行したいときは Rake::Task#reenable というメソッドを実行する必要があります。
https://github.com/ruby/ruby/blob/trunk/lib/rake/task.rb#L155
https://github.com/ruby/ruby/blob/trunk/lib/rake/task.rb#L118
before do
@rake["book:dismissed_suppliers"].invoke
reenable
end
もしくは、#invoke
ではなく、 #execute
で呼び出すことで、テストコードのなかで二度 Rake タスクを実行することが可能になります。
before do
@rake["book:dismissed_suppliers"].execute
end
特に理由がない限りは #execute
で Rake タスクを呼び出す方が楽でいいと思います。
参考
こちらの記事のコメント欄が参考になります。