人生初のGemをつくってみました!
rspec_rake

背景

Rakeタスクのテスト(RSpec)を書く時に躓くことが多く、そこを楽にできたらいいなーと思ったのがきっかけです。あとそろそろGemつくってみたかった。

使い方

仮に、

  • Railsプロジェクト
  • Rakeファイルはlib/tasks以下に入ってる

という想定だと、以下のような感じで設定します。

# in spec/rails_helper.rb

RSpecRake.configure do |config|
  config.require_tasks(File.join(Rails.root, 'lib', 'tasks'))
  config.auto_reenable = true
end

.require_tasksはRakeタスク定義してるだけなので、他の方法でも良いです。
どちらかと言うと、.auto_reenableの方が欲しい機能でした。

auto_reenable

Rake タスクをテストコードの中で複数回実行する
こちらの記事に書かれているように、Rakeタスクの#invokeメソッドを2回以上実行する時は、その都度#reenableメソッドを呼ぶ必要があります。
ここではテストなので、成功パターン・失敗パターンだけでも2回以上実行することになりますよね…!

で、毎度#reenableを呼ぶのは面倒なので、

  config.auto_reenable = true

と設定すれば、タスク実行後に自動的に#reenableするようにしました。

但し、タスク内で別のタスクを呼んだりなど、無限ループするような書き方には注意です!

ちなみに、#executeメソッドなら何度でも実行できて楽なのですが、こっちはこっちでタスクに引数が渡しづらいという悩みが出てきたりします笑

specファイル内でのタスク実行方法

上記の設定ができていれば、specファイル内ではRake::Taskから対象のタスクを呼ぶだけでOKです。

# before, it, afterなどどこでも
Rake::Task['some:task'].invoke

各specファイルではRakeの定義などは要らないし、どのタスクでも呼べるので結構楽に書けると思います。

懸念点

RSpec起動時にすべてのRakeファイルを読み込む想定なので、テストの実行時間が増えるかもしれないです。
色んなプロジェクトで試したりとかしてないので、やってみてどうだったとか感想もらえると嬉しいです!

参考にした記事

Test Rake Tasks Like a BOSS
[Ruby on Rails]RSpecによるRakeのテスト
Rake タスクをテストコードの中で複数回実行する
RubyGemはめっちゃ簡単に作れる!