rspec_rake っていうGemをつくってみた
人生初の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はめっちゃ簡単に作れる!