Barauna Hugo - Cucumber e RSpec стр 21.

Шрифт
Фон

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.

Ваша оценка очень важна

0
Шрифт
Фон

Помогите Вашим друзьям узнать о библиотеке