O que está errado com esse teste?
Os exemplos aqui estão em “plain Ruby”, mas eu tirei de um projeto Ruby on Rails.
E se eu tivesse um teste assim:
describe User do
it "should upcase its own name" do
user = User.new
user.name = "alice"
user.upcase_name!
expect(user.name).to eq "ALICE"
end
end
O que você acha que está errado com ele?
Mas e se eu te mostrasse isso:
describe User do
context "when a user has a name" do
subject { User.new }
before { subject.name = "alice" }
it { expect { subject.upcase_name! }.to change { subject.name }.to("ALICE") }
end
end
Ficou melhor? Mais difícil de ler?
Comente abaixo o que você acha, eu vou adicionar apenas alguns pontos:
Sempre tenha um subject
Espera-se que todo test (i. e., it) tenha um subject. É a principal razão do teste, é o alvo do código do teste.
Sempre que procuro entender um teste eu procuro primeiro pelo subject, quem ele é, como ele é inicialmente, …
Se o seu subject não é construído pelo new/initialize crie-o usando um bloco subject {}. Será mais fácil de ler.
O subject deve ser do mesmo tipo do describe mais em cima
Se o seu describe mais externo/superior é um describe User o que você, quando lê o teste, espera que seja testado? Um usuário, certo? Não faça bagunça com isso.
Procure descrever o comportamento certo do seu código
Ok, ok, ok, não vamos falar sobre TDD vs BDD, Test::Unit vs RSpec. Continue lendo.
Este é o comportamento do seu código.
Quando eu chamo
upcase_name!alguma mudança ocorre no nome do usuário
Então… escreva teste para isso. Continue lendo.
Se você tiver este código:
def name=(name)
@name = name.upcase
end
E (não importa o motivo) também tem o upcase_name! você precisa de dois tests.
Com este código, o que re-escrevi vai falhar, por que no meu teste eu explicitamente falei que a mudança ocorre quando chamo o upcase_name!.
Com este método name= espera-se que o teste seja mais ou menos assim:
describe User do
it "should always store name as upcase" do
subject.name = "alice"
expect(subject.name).to eq "ALICE"
end
end
Bônus
Compare a saída do rspec --format documentation:
$ rspec spec/foo_spec.rb --format documentation
User
should upcase its own name
#upcase_name!
should change `subject.name` to "ALICE"
should always store name as upcase
Finished in 0.02947 seconds (files took 0.16243 seconds to load)
3 examples, 0 failures