Help us understand the problem. What is going on with this article?

Rake タスクをテストコードの中で複数回実行する

More than 5 years have passed since last update.

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 タスクを呼び出す方が楽でいいと思います。

参考

こちらの記事のコメント欄が参考になります。

phil.sergi.blog: Testing Rake Tasks with RSpec

morygonzalez
新米プログラマーです。
http://portalshit.net
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away