自動化ツールのGuardの紹介をします。
Guardはファイルを監視して、ファイルになんらかの変更がされたら、指定した処理を実行するツールです。
この機能を使ってファイルが変更されたらテストを自動で実行させたり、シンタックスチェックをすることができます。
今回はrspecで自動的にテストを実行する方法を紹介します。
まずはGuardのinstallをします。
Gemfileに定義してインストールします。
Gemfile
1 | group :development do |
bundle installして、Guardfileを作成します。
GuardfileはGuardの設定を定義するファイルです。
1 | $ bundle install |
guard init rspecを実行するとrspecの設定が書かれたGuardfileが作成されます。
Railsを想定した設定が書かれていますので、Railsの場合はそのままでOKです。
ファイルが実行されたらrspecを実行する
ファイルが実行されたらrspecを実行するようにしましょう。
別でウィンドウを開いてguardを実行します。
1 | bundle exec guard |
ファイルを変更するとそのファイルのテストが実行され、テスト結果が表示されます。
Guard-rspecのDSL
Guardの設定はGuardのDSLを用いて設定します。
1 | # rspecのグループを定義し、監視しているファイルに変更があった場合は"bundle exec rspec""を実行する。 |
watchで監視するファイルを設定します。
watchの引数は以下です。
1 | watch(監視するファイル) { コマンドに渡される引数 } |
ここででてきた、rspec.spec_helper
と rspec.spec_dir
はどんな値を返すのでしょうか。
pryで覗いてみましょう。
1 | $ pry |
ソースを少し見てみましょう。
1 | def rspec |
https://github.com/guard/guard-rspec/blob/master/lib/guard/rspec/dsl.rb#L28
実装にはOpenStruct
が使われています。OpenStruct
とは要素を動的に追加・削除できる手軽な構造体を提供するクラスです
http://docs.ruby-lang.org/ja/2.1.0/class/OpenStruct.html
要素を追加するためにtapメソッドを使っています。OpenStruct
とtapメソッドをうまく使っていますね。
実は、というか当たり前なのですがOpenStructなので値の上書きも簡単にできてしまいます。
1 | > rspec.spec_helper |
Guardのカスタマイズ
Guardの様々なプラグインが開発されています。
プラグインは以下のページで参照できます。
https://github.com/guard/guard/wiki/Guard-Plugins
ちなみに、今回使ったguard-rspec
もGuardのプラグインです。
他にも様々なプラグインが用意されています。