Meu 'ah-ha!' momentos sobre os testes em Ruby e Rails vieram quando eu realmente me sentei e li os recursos definitivos sobre o assunto, os livros Rspec e Cucumber . Eu compartilhei seu desdém inicial por Pepino, mas então percebi que estava olhando a foto pelo ângulo errado.
Basicamente, o Pepino é sobre BDD (desenvolvimento orientado a comportamento) - você usa o Pepino para planejar seus recursos, no que trabalhará a seguir. Hmm, em seguida, você deseja que os usuários possam promover postagens em um fórum ou algo assim (para roubar um exemplo;)) Então você escreve algo simples.
Given I am logged in
And I can see the post "BDD is awesome"
When I vote the post up
Then the post should have one more vote
And the page should show a message thanking me for my vote.
Observe que não há referências a qualquer código relacionado lá. Isso vem em seus passos. Quando você refatorar seu código, talvez seja necessário alterar suas definições de etapa, mas o comportamento (seu recurso) nunca precisará ser alterado.
Agora, toda vez que você executar o recurso Pepino, você será orientado sobre como testar o recurso usando TDD (desenvolvimento orientado a teste). Isso é feito em um nível inferior usando o RSpec.
Primeira execução - minha definição da primeira etapa é indefinida. Copie o bloco para defini-lo em, por exemplo, user_steps.rb ou mesmo session_steps.rb, porque está relacionado aos usuários e suas sessões. Agora, como você define que um usuário está logado? Você pode levá-los através do processo de login.
Given /^I am logged in$/ do
visit login_path
fill_in :name, :with => 'Joe'
fill_in :password, :with => 'Password'
click_button 'submit'
end
Deveria ser todo feliz. Segundo passo.
Given /^I can see the post "(.+)"$/ do |name|
visit post_path(Post.find_by_name(name))
end
Mais uma vez bem fácil. Observe que, se refizermos totalmente nosso processo de login ou como nossas postagens são definidas e exibidas, não precisamos alterar o comportamento. Terceiro passo.
When /^I vote the post up$/ do
pending
end
Aqui é onde você começa a falar sobre novas funcionalidades, mas ainda não sabe como isso vai funcionar. Como você vota uma postagem? Você pode clicar em uma imagem de +1 ou algo assim, que faz uma postagem do ajax em um controlador, que retorna JSON ou algo parecido. Então agora você pode passar para o teste Rspec puro.
- Teste sua visualização para garantir que a imagem +1 seja exibida,
- Teste o seu controlador se ele se comporta corretamente quando recebe uma solicitação ajax do formato correto (os caminhos feliz e infeliz - e se um ID de postagem inválido for recebido? O que acontece se o usuário tiver esgotado os 25 upvotes em um dia? Aumenta o número de votos corretamente?)
- Teste seu javascript se ele responde corretamente quando recebe um blob de JSON no formato correto (atualiza a imagem +1 para mostrar que foi usada? (Pensando no Google+ aqui ...) Mostra a mensagem de agradecimento? Etc. )
Tudo isso não afeta o comportamento - mas quando você terminar de lidar com os testes de nível inferior, será trivial preencher a definição da etapa de como votar em uma postagem. Pode ser tão simples quanto click_link '+1'
. E o restante das etapas está testando resultados, o que novamente deve ser simples de fazer. E quando terminar, você sabe que seu recurso está completo e concluído. Se o comportamento necessário mudar, você poderá ajustar seu recurso, ou o código de implementação em perfeita segurança.
Espero que isto faça sentido. Está tudo errado, mas acho que demonstra a diferença entre o BDD e o TDD, e por que o Cucumber e o RSpec atendem a diferentes necessidades.