guardで楽々テスト実行

RailsCastsで知ったgemです。

テストファイルを編集するたびにターミナルに戻ってコマンドを打つのはちょっと面倒なものです。Jenkinsでテストをやらせるという手もあるのですが、Jenkinsはコミットしないとテストをしてくれないので、ちょっと手元で確かめるのは不向きです。

そこで、guardです。guardは、手元でファイルを編集・保存したらそれを検知して勝手にテストをやってくれるgemです。

インストール

使っているテストに応じてインストールするGemが変わります。私は、RSpecを使っているので、Gemfileに

group :development do
   gem 'guard-rspec'
end

と記述します。下手に

group :development do
   gem 'guard'
end

ってことをやっちゃうと、のちのち、Guardfileの作成に苦しむので、やめるように。

後は、bundle installしてあげればOK。

Guardfileの初期化

次に、Guardfileを作成します。

guard init rspec

としてあげることで、Guardfileが作られます。作られるGuardfileは、

# A sample Guardfile
# More info at https://github.com/guard/guard#readme

guard 'rspec', :version => 2 do
  watch(%r{^spec/.+_spec\.rb$})
  watch(%r{^lib/(.+)\.rb$})     { |m| "spec/lib/#{m[1]}_spec.rb" }
  watch('spec/spec_helper.rb')  { "spec" }

  # Rails example
  watch(%r{^app/(.+)\.rb$})                           { |m| "spec/#{m[1]}_spec.rb" }
  watch(%r{^app/(.*)(\.erb|\.haml)$})                 { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
  watch(%r{^app/controllers/(.+)_(controller)\.rb$})  { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
  watch(%r{^spec/support/(.+)\.rb$})                  { "spec" }
  watch('config/routes.rb')                           { "spec/routing" }
  watch('app/controllers/application_controller.rb')  { "spec/controllers" }
  # Capybara request specs
  watch(%r{^app/views/(.+)/.*\.(erb|haml)$})          { |m| "spec/requests/#{m[1]}_spec.rb" }
end

ってな感じ。

後は、ターミナル上で、

$ guard

って打てばOK。なんか、

WARNING: You are using Guard outside of Bundler, this is dangerous and may not work. Using `bundle exec guard` is safer.

ってメッセージが出て、「おめぇがやっている方法は危険だから、bundle exec guardってやれ」(意訳)って怒られるんだけど、気にしない。

後は、specファイルを編集するたびに勝手にrspecが動いてくれます。