Durante um bom tempo andei evangelizando o uso do Shoulda na Surgeworks e fiz muito uso dele em meus projetos pessoais. O fato é que não obtive muito sucesso em evangelizar meus colegas de trabalho a adotarem o Shoulda, por outro lado eles conseguiram me convencer a aprender e usar RSpec.
E realmente RSpec é um framework de testes muito interessante. Mas tudo ficou ainda mais interessante quando comecei a brincar com o Cucumber (pretendo escrever sobre isto no futuro).
Mas o segredo do sucesso do Shoulda é a maneira em que ele transforma testes comuns como verificar se as associações estão funcionando, se todas as validações necessárias foram adicionadas ou se uma simples informação foi adicionada corretamente a sessão, em algo extremamente trivial.
Passei a gostar cada dia mais do RSpec e decidi adotá-lo como meu framework oficial de testes de agora em diante. Mas não posso mais viver sem as facilidades que o Shoulda me oferecia. Então resolvi coçar a minha própria coceira.
Remarkable
Inicialmente, a função do Remarkable é portar para RSpec todas as macros do Shoulda, mas obviamente o plano é muito mais ambicioso do que isto. Tenho muita coisa em mente que tornará este projeto especialmente útil para os usuários de RSpec.
Neste momento você talvez se pergunte: “Mas já não existem plugins que fazem a mesma coisa, como o skinny e o rspec-on-rails-matchers, por exemplo?”. Sou obrigado a responder: “Sim”. Então, por que mais um projeto?
Por que mais um projeto?
Em primeiro lugar este não é simplesmente “mais um” plugin com matchers para RSpec. Vou usar um clichê agora, mas é mais pura verdade: “Este é um projeto feito do jeito certo!”.
Vejamos então uma lista com o que torna o Remarkable único:
- Não é um plugin, e sim um gem.
- Porta todas as macros atuais do Shoulda para RSpec.
- Possui duas sintaxes de escrita, uma para quem gosta do estilo RSpec e outra para os que estão migrando seus projetos Shoulda para RSpec.
- Testes.
- Mais testes.
- E mais um pouco de testes.
Sim, diferente de todos os outros projetos com o mesmo objetivo, o Remarkable é o único que possui testes, e este é um grande diferencial, acredite! Como se pode confiar em um projeto que não tem testes? Como evoluir um projeto open-source que não possui testes? O que garante que o último commit não quebrou alguma coisa que estava funcionando?
Instalação
Instalar o Remarkable é muito fácil. Ele está armazenado no GitHub, então se você nunca instalou um gem via GitHub execute primeiro:
Agora instale o gem:
Por último adicione a seguinte linha no seu arquivo RAILS_ROOT/config/environment.rb:
Usando
Todas as macros do Remarkable podem ser acessadas de duas maneira diferentes. Para aqueles que preferem o estilo Shoulda, vejamos como ficaria o teste de um modelo:
fixtures :all
should_belong_to :user
should_belong_to :owner
should_belong_to :user, :owner
should_have_many :tags, :through => :taggings
should_have_many :through_tags, :through => :taggings
should_have_many :tags, :through_tags, :through => :taggings
should_require_unique_attributes :title
should_require_attributes :body, :message => /wtf/
should_require_attributes :title
should_only_allow_numeric_values_for :user_id
end
Igualzinho ao Shoulda? É esta a idéia! Esta sintaxe é ideal para aqueles que desejarem migrar seus testes do Shoulda para o RSpec (tendo apenas de alterar de context para describe e de should para it) ou mesmo para os que adoram a jeitão do Shoulda, assim como eu.
Mas se você não gosta desta sintaxe, também pode criar os mesmos testes da seguinte forma:
fixtures :all
Agora muito mais no estilo RSpec!
Macros
Veja uma relação com todas as macros disponíveis na documentação do projeto.
Para o estilo Shoulda, clique aqui. Para o estilo RSpec, clique aqui.
Finalizando
Este projeto já atingiu o primeiro objetivo, que era portar todas as macros do Shoulda para o RSpec. Tudo feito da maneira correta, com todos os cuidados e muitos testes. Mas nada melhor do que o uso na prática para encontrarmos pontos que devem ser melhorados.
Enfim, usem o Remarkable, e ajudem a torná-lo ainda melhor!