RSpec - Filtragem

Você pode querer ler a seção sobre Metadados RSpec antes de ler esta seção porque, ao que parece, a filtragem RSpec é baseada em Metadados RSpec.

Imagine que você tem um arquivo de especificações e ele contém dois tipos de testes (exemplos): testes funcionais positivos e testes negativos (erros). Vamos defini-los assim -

RSpec.describe "An Example Group with positive and negative Examples" do 
   context 'when testing Ruby\'s build-in math library' do
      
      it 'can do normal numeric operations' do 
         expect(1 + 1).to eq(2) 
      end 
      
      it 'generates an error when expected' do
         expect{1/0}.to raise_error(ZeroDivisionError) 
      end
      
   end 
end

Agora, salve o texto acima como um arquivo chamado 'filter_spec.rb' e execute-o com este comando -

rspec filter_spec.rb

Você verá uma saída parecida com isto -

.. 
Finished in 0.003 seconds (files took 0.11201 seconds to load) 
2 examples, 0 failures

Agora, e se quiséssemos executar novamente apenas os testes positivos neste arquivo? Ou apenas os testes negativos? Podemos fazer isso facilmente com filtros RSpec. Altere o código acima para este -

RSpec.describe "An Example Group with positive and negative Examples" do 
   context 'when testing Ruby\'s build-in math library' do
      
      it 'can do normal numeric operations', positive: true do 
         expect(1 + 1).to eq(2) 
      end 
      
      it 'generates an error when expected', negative: true do 
         expect{1/0}.to raise_error(ZeroDivisionError) 
      end
      
   end 
end

Salve suas alterações em filter_spec.rb e execute este comando ligeiramente diferente -

rspec --tag positive filter_spec.rb

Agora, você verá uma saída semelhante a esta -

Run options: include {:positive=>true} 
. 
Finished in 0.001 seconds (files took 0.11401 seconds to load) 
1 example, 0 failures

Ao especificar --tag positivo, estamos dizendo ao RSpec para executar exemplos apenas com a variável de metadados: positivo definida. Poderíamos fazer a mesma coisa com testes negativos executando o comando como este -

rspec --tag negative filter_spec.rb

Lembre-se de que esses são apenas exemplos, você pode especificar um filtro com qualquer nome que desejar.

Formatadores RSpec

Os formatadores permitem que o RSpec exiba a saída dos testes de maneiras diferentes. Vamos criar um novo arquivo RSpec contendo este código -

RSpec.describe "A spec file to demonstrate how RSpec Formatters work" do 
   context 'when running some tests' do 
      
      it 'the test usually calls the expect() method at least once' do 
         expect(1 + 1).to eq(2) 
      end
      
   end 
end

Agora, salve em um arquivo chamado formatter_spec.rb e execute este comando RSpec -

rspec formatter_spec.rb

Você deve ver uma saída parecida com esta -

. 
Finished in 0.002 seconds (files took 0.11401 seconds to load) 
1 example, 0 failures

Agora execute o mesmo comando, mas desta vez especifique um formatador, como este -

rspec --format progress formatter_spec.rb

Você deve ver a mesma saída desta vez -

. 
Finished in 0.002 seconds (files took 0.11401 seconds to load) 
1 example, 0 failures

O motivo é que o formatador de “progresso” é o formatador padrão. Vamos tentar um formatador diferente a seguir, tente executar este comando -

rspec --format doc formatter_spec.rb

Agora você deve ver esta saída -

A spec file to demonstrate how RSpec Formatters work 
   when running some tests 
      the test usually calls the expect() method at least once
Finished in 0.002 seconds (files took 0.11401 seconds to load) 
1 example, 0 failures

Como você pode ver, a saída é bem diferente com o formatador “doc”. Este formatador apresenta a saída em um estilo semelhante a documentação. Você deve estar se perguntando como são essas opções quando ocorre uma falha em um teste (exemplo). Vamos mudar o código emformatter_spec.rb parecer assim -

RSpec.describe "A spec file to demonstrate how RSpec Formatters work" do 
   context 'when running some tests' do 
      
      it 'the test usually calls the expect() method at least once' do 
         expect(1 + 1).to eq(1) 
      end
      
   end 
end

A expectativa expect(1 + 1).to eq(1)deve falhar. Salve suas alterações e execute novamente os comandos acima -

rspec --format progress formatter_spec.rb e lembre-se, como o formatador de “progresso” é o padrão, você pode simplesmente executar: rspec formatter_spec.rb. Você deve ver esta saída -

F 
Failures:
1) A spec file to demonstrate how RSpec Formatters work when running some tests 
the test usually calls the expect() method at least once
   Failure/Error: expect(1 + 1).to eq(1)
	
      expected: 1
         got: 2
			  
      (compared using ==)			  
   # ./formatter_spec.rb:4:in `block (3 levels) in <top (required)>'

Finished in 0.016 seconds (files took 0.11201 seconds to load)
1 example, 1 failure
Failed examples:

rspec ./formatter_spec.rb:3 # A spec file to demonstrate how RSpec 
   Formatters work when running some tests the test usually calls 
   the expect() method at least once

Agora, vamos tentar o formatador doc, execute este comando -

rspec --format doc formatter_spec.rb

Agora, com o teste com falha, você deve ver esta saída -

A spec file to demonstrate how RSpec Formatters work
   when running some tests
      the test usually calls the expect() method at least once (FAILED - 1)
		
Failures:

1) A spec file to demonstrate how RSpec Formatters work when running some
   tests the test usually calls the expect() method at least once
   Failure/Error: expect(1 + 1).to eq(1)
	
   expected: 1
        got: 2
		  
   (compared using ==)
   # ./formatter_spec.rb:4:in `block (3 levels) in <top (required)>'
	
Finished in 0.015 seconds (files took 0.11401 seconds to load) 
1 example, 1 failure

Exemplos de falha

rspec ./formatter_spec.rb:3 # Um arquivo de especificação para demonstrar como os formatadores RSpec funcionam ao executar alguns testes, o teste geralmente chama o método expect () pelo menos uma vez.

Os formatadores RSpec oferecem a capacidade de alterar a forma como os resultados do teste são exibidos, é até possível criar seu próprio formatador personalizado, mas esse é um tópico mais avançado.