Marcio Trindade

Conhecendo o Spork

A um certo tempo ouvi falar da gem Spork criada pelo Tim Happer que trabalha como um servidor drb, funciona mais ou menos como um servidor web em modo development onde todo rails e as configurações como rotas, spec_helper, factories e outras são carregadas e persistem em memória, então quando você rodar seus testes usando o servidor drb não será necessário carregar todo o framework e sim apenas suas classes e testes.

Para instalar basta declara-la em seu projeto.

Gemfile
gem 'spork', '~> 0.9.0.rc'

Não esqueça de rodar o comando bundle depois que alterar o Gemfile.

O Tim Happer ainda sugere rodar o comando spork --bootstrap pra adicionar a configuração no seu spec_helper.rb, porém eu prefiro editar o arquivo por mim mesmo já que é muito simples e mesmo com o comando acima você precisará editar o arquivo, veja o antes e o depois pra entender melhor.

spec_helper.rb
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'

Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

RSpec.configure do |config|
  config.use_transactional_fixtures = true
  config.after(:all) do
    DatabaseCleaner.clean
  end
end

Agora veja depois que adicionei o spork como ficou.

spec_helper.rb
require 'rubygems'
require 'spork'

Spork.prefork do
  ENV["RAILS_ENV"] ||= 'test'
  require File.expand_path("../../config/environment", __FILE__)
  require 'rspec/rails'

  Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}

  RSpec.configure do |config|
    config.use_transactional_fixtures = true
    config.after(:all) do
      DatabaseCleaner.clean
    end
  end
end

Altere também o environment de test pra não fazer cache de suas classes.

config/environments/test.rb
config.cache_classes = false

Pronto a configuração está feita, basta você iniciar o spork e depois rodar seus testes.

console1
spork
console2
rspec spec/ --drb

Como da pra ver basta adicionar a opção --drb que o rspec já utiliza o servidor drb disponível, porém se você quiser rodar sem basta não utiliza-la que os testes continuam funcionando normalmente.

Você não precisar colocar a opção a todo momento, basta alterar o seu .rspec e tornar a flag --drb como padrão.

.rspec
--colour --drb

Vale esclarecer que eu já tive problemas utilizando o spork junto com o devise que faz cache das classes que o implementam, sendo assim quando preciso alterar o meu user.rb eu paro o spork e depois inicio novamente.