uma quebra de linha entre cada fase do teste, de modo que fique fácil entender a
estrutura do mesmo só batendo o olho.
Para ficar explícito, segue o código do teste acima com um comentário para cada
fase:
describe Stack do
describe "#push" do
it "puts an element at the top of the stack" do
# setup
71
4.5. Organizando seus testes
Casa do Código
stack = Stack.new
# exercise
stack.push(1)
stack.push(2)
# verify
expect(stack.top).to eq(2)
end
end
end
Nem sempre é necessário escrevermos a fase de teardown, pois a sua necessidade
depende do teste sendo escrito. Um exemplo de teste que tem a fase de teardown é
o teste que escrevemos quando vimos o after hook:
after(:all) do
# teardown
FileUtils.rm(Dir.glob("#{cache_dir}/*"))
end
it "caches the result in a file" do
expect {
# exercise
my_cool_object.run
}.to change { File.exists?(cache_path) }.from(false).to(true)
# verify com change matcher
end
Só para ficar claro, não é necessário você escrever um comentário explicando
cada fase do teste, mas colocar uma quebra de linha entre cada fase irá ajudar bastante o leitor a entender a estrutura do seu teste visualmente. Compare um teste com e sem
essas quebras de linha e reflita sobre qual é mais claro em relação às fases do teste:
# sem quebra de linha
it "puts an element at the top of the stack" do
stack = Stack.new
stack.push(1)
stack.push(2)
expect(stack.top).to eq(2)
end
72
Casa do Código
Capítulo 4. Organização, refatoração e reuso de testes com o RSpec
# com quebra de linha
it "puts an element at the top of the stack" do
stack = Stack.new
stack.push(1)
stack.push(2)
expect(stack.top).to eq(2)
end
Estruturar seu teste seguindo as quatro fases dos testes xUnit irá ajudar o leitor
a entender a relação de causa e consequência do seu teste de modo mais eficiente.
Usando um example group por método
Antes de começarmos a falar sobre como organizar seus example groups, você
precisa primeiro saber o que é um example group do RSpec. Então senta que lá vem
história.
Como vimos na seção 2.3, o BDD propõe uma mudança na nomenclatura ori-
ginal do TDD para que seja mais fácil de entender a real motivação da prática de
test-driven development. Ao invés de teste, um outro termo muito usado no mundo
do BDD é a palavra exemplo.
Ao escrever um teste para o seu código, você está na verdade escrevendo um
exemplo de como o seu código pode ser usado. Como as vezes somente um exemplo
não é o bastante, você escreve vários exemplos. Se você seguir a filosofia do BDD,
seus exemplos podem servir até como parte da documentação do seu código.
Ter testes como parte
da documentação pode ser muito útil por exemplo no caso
que você está escrevendo uma biblioteca. Se você usar BDD para escrever sua bibli-
oteca, o desenvolvedor que for usá-la pode usar como referência não só a documen-
tação da API da sua lib, mas também exemplos reais de código olhando os testes
dela.
Pois bem, o RSpec utiliza essa nomenclatura de exemplos na sua estrutura in-
terna. Você pode confirmar isso entendendo o retorno dos métodos it e describe
do RSpec.
O que o método
it
retorna na verdade é um objeto da classe
RSpec::Core::Example, um objeto que representa um exemplo de uso do
seu código, o teste em si. Quando você precisa organizar esses vários examples
73
4.5. Organizando seus testes
Casa do Código
dentro de um grupo que faça sentido, você usa o método describe, que retorna
uma classe chamada RSpec::Core::ExampleGroup, que representa um grupo
de examples.
Agora que já sabemos de onde vem os nomes Example e ExampleGroup que o
RSpec utiliza normalmente, vamos olhar uma convenção de como organizar example
groups dos seus testes.
Na seção 3.1 nós escrevemos um teste de pilha do seguinte modo:
describe Stack do
describe "#push" do
it "puts an element at the top of the stack" do
stack = Stack.new
stack.push(1)
stack.push(2)
expect(stack.top).to eq(2)
end
end
end
Perceba como usamos o método describe para agrupar os testes relacionados
ao método Stack#push:
describe Stack do
describe "#push" do
# testes relacionados ao método Stack#push
end
end
Agrupar os testes de um método de instância utilizando o describe desse
modo é uma convenção muito usada para organizar seus testes em um example
group por método.
A mesma convenção pode ser usada para agrupar os testes de um método de
class dentro de um example group com o nome desse método:
describe Stack do
describe ".limit" do
# testes relacionados ao método Stack.limit
end
end
74
Casa do Código
Capítulo 4. Organização, refatoração e reuso de testes com o RSpec
Como essa organização é apenas uma convenção, você não é obrigado a usá-la.
Mas cada vez mais essa convenção vem se tornando uma boa prática na comuni-
dade, pois ela facilita ao leitor dos testes encontrar todos os testes relacionados a um determinado método, algo que é muito útil se esse leitor estiver querendo entender
o comportamento de um método em específico.