やりたいこと
下記のように、rubyソースコード、specファイル、Guardfileが全て一つのディレクトリにフラットに配置されている環境で、guardによる自動テスト実行を行いたい。
root_dir
├── Guardfile
├── gilded_rose.rb
└── gilded_rose_spec.rb
設定方法
guard, guard-rspecをインストールする
上記のような配置の場合、bundleを使っていることは考えにくいのでシステムにインストールしておく。
gem install guard guard-rspec
Guardfileを作成
root_dirにGuardfileを作成し、下記を記述する。
guard :rspec, cmd: 'rspec', spec_paths: ["./"] do
watch(%r{.+_spec\.rb$}) { |m| "./#{m[0]}" }
watch(%r{(.+)(?!_spec)\.rb$}) { |m| "./#{m[1]}_spec.rb" }
end
guardを実行
guard
guardを実行してから、rubyファイルかspecファイルを更新すれば、自動的にspecが実行される。
上記のように設定する理由
デフォルトの設定だと自動実行されないため。
デフォルトでは、実行ファイルはlibディレクトリ配下、specファイルはspecディレクトリに配置されていることが想定されている。したがって、カレントディレクトリ配下でも動くように設定を変えてやる必要がある。
ポイント
-
spec_paths
にカレントディレクトリを設定する
guardはこれをテスト用のファイルが入っているディレクトリとみなす。ここに入っていないテストの実行は防止する仕組みになっている。 -
watchのブロックの返り値に
./
がつくようにする
ファイルの変更を検出すると、watchのブロックを評価した結果のパスで指定されるspecファイルを実行するが、これがspec_pathsに入っているか確認している。spec_pathsに./
と指定しているので、ブロックの返り値のパスが./
で始まっていないと対象のフォルダに入っていないとみなしてしまう。
実行するファイルのフィルタは下記のソースコードを参照。
https://github.com/guard/guard-rspec/blob/master/lib/guard/rspec/inspectors/base_inspector.rb#L48-L50