Marcio Trindade

Introdução ao Guard

Dando continuidade aos últimos artigos resolvi escrever sobre a Guard, uma gem que complementa de forma incrível o uso do spork e automatiza seus testes.

A Guard tem uma função parecida com a Watcher, que praticamente fica monitorando alterações em seus arquivos e pode executar deterinadas ações quando isso ocorre, porém ele é bem estruturado e aceita outras gems complementares pra facilitar nosso dia a dia, uma destas é a guard-rspec e a guard-spork.

Instalação

Basta adicionar a gem no gemfile do seu projeto.

Gemfile
group :test do
  gem 'guard-rspec'
  gem 'guard-spork'
end

Observe que não precisei declarar a gem "guard" por que é uma dependência do guard-rspec e do guard-spork logo o bundler cuida disso pra gente.

Agora basta executar os comandos abaixo:

console
guard init spork
guard init rspec

O primeiro comando ele cria o arquivo Guarfile e adiciona a configuração para o spork, já o segundo adiciona a configuração do rspec neste mesmo arquivo.

Pra iniciar o guard basta executar:

console
guard

Assim o guard inicia o spork automaticamente e roda todos specs e quando você salvar um arquivo ele roda o spec relacionado a este.

Algumas dicas pra configuração

No Guardfile você pode adicionar o diretório support pra ser assistido, assim quando você alterar um arquivo dentro do spec/support ele já faz o reload automatico do spork.

Guardfile
guard 'spork', :cucumber_env => { 'RAILS_ENV' => 'test' }, :rspec_env => { 'RAILS_ENV' => 'test' } do
  watch('config/application.rb')
  watch('config/environment.rb')
  watch(%r{^config/environments/.+\.rb$})
  watch(%r{^config/initializers/.+\.rb$})
  watch('spec/spec_helper.rb')
  watch(%r{^spec/support/.+\.rb$})
end

Se você tem um projeto grande com muitos spec que demora muito pra rodar você pode configurar o Guardfile pra não rodar todos os exemplos quando o guard inicia ou quando passa todos spec de um arquivo que estava com pelo menos um failer.

Guardfile
guard 'rspec', :version => 2, :cli => "--drb", :all_after_pass => false, :all_on_start => false do
  watch(%r{^spec/.+_spec\.rb})
  watch(%r{^lib/(.+)\.rb})     { |m| "spec/lib/#{m[1]}_spec.rb" }
  …
end

Desta maneira o guard não irá rodar toda suite de test a nenhum momento, porém você pode executar isso manualmente, basta apertar a tecla enter a qualquer momento no terminal que o guard está em execução que o guard se encarrega da tarefa.

Este artigo é só uma pequena introdução, recomendo que você procure mais detalhes a respeito destas gems e passe a usa-las em seu dia-a-dia.