RSpec - Escrevendo especificações

Neste capítulo, iremos criar uma nova classe Ruby, salvá-la em seu próprio arquivo e criar um arquivo spec separado para testar esta classe.

Primeiro, em nossa nova classe, é chamado StringAnalyzer. É uma classe simples que, você adivinhou, analisa strings. Nossa classe tem apenas um métodohas_vowels?que, como o nome sugere, retorna verdadeiro se uma string contém vogais e falso se não contém. Aqui está a implementação paraStringAnalyzer -

class StringAnalyzer 
   def has_vowels?(str) 
      !!(str =~ /[aeio]+/i) 
   end 
end

Se você seguiu a seção HelloWorld, criou uma pasta chamada C: \ rspec_tutorial \ spec.

Exclua o arquivo hello_world.rb se o tiver e salve o código StringAnalyzer acima em um arquivo chamado string_analyzer.rb na pasta C: \ rspec_tutorial \ spec.

Aqui está a fonte de nosso arquivo de especificações para testar StringAnalyzer -

require 'string_analyzer' 

describe StringAnalyzer do 
   context "With valid input" do 
      
      it "should detect when a string contains vowels" do 
         sa = StringAnalyzer.new 
         test_string = 'uuu' 
         expect(sa.has_vowels? test_string).to be true 
      end 
		
      it "should detect when a string doesn't contain vowels" do 
         sa = StringAnalyzer.new 
         test_string = 'bcdfg' 
         expect(sa.has_vowels? test_string).to be false
      end 
      
   end 
end

Salve-o no mesmo diretório de especificações, dando a ele o nome string_analyzer_test.rb.

Na janela cmd.exe, faça cd para a pasta C: \ rspec_tutorial e execute este comando: dir spec

Você deve ver o seguinte -

Diretório de C: \ rspec_tutorial \ spec

09/13/2015 08:22 AM  <DIR>    .
09/13/2015 08:22 AM  <DIR>    ..
09/12/2015 11:44 PM                 81 string_analyzer.rb
09/12/2015 11:46 PM              451 string_analyzer_test.rb

Agora vamos executar nossos testes, execute este comando: rspec spec

Quando você passa o nome de uma pasta para rspec, ele executa todos os arquivos de especificação dentro da pasta. Você deve ver este resultado -

No examples found.

Finished in 0 seconds (files took 0.068 seconds to load)
0 examples, 0 failures

A razão pela qual isso aconteceu é que, por padrão, rspecexecuta apenas arquivos cujos nomes terminam em “_spec.rb”. Renomeie string_analyzer_test.rb para string_analyzer_spec.rb. Você pode fazer isso facilmente executando este comando -

ren spec\string_analyzer_test.rb string_analyzer_spec.rb

Agora corra rspec especificação novamente, você deve ver uma saída parecida com esta -

F.
Failures:

   1) StringAnalyzer With valid input should detect when a string contains vowels
      Failure/Error: expect(sa.has_vowels? test_string).to be true 
         expected true
            got false
      # ./spec/string_analyzer_spec.rb:9:in `block (3 levels) in <top (required)>'

Finished in 0.015 seconds (files took 0.12201 seconds to load)
2 examples, 1 failure

Failed examples:
rspec ./spec/string_analyzer_spec.rb:6 # StringAnalyzer With valid 
   input should detect when a string contains vowels
Do you see what just happened? Our spec failed because we have a bug in 
   StringAnalyzer. The bug is simple to fix, open up string_analyzer.rb
   in a text editor and change this line:
!!(str =~ /[aeio]+/i)
to this:
!!(str =~ /[aeiou]+/i)

Agora, salve as alterações que você acabou de fazer em string_analyizer.rb e execute o comando rspec spec novamente, você deve ver uma saída semelhante a -

..
Finished in 0.002 seconds (files took 0.11401 seconds to load)
2 examples, 0 failures

Parabéns, os exemplos (testes) em seu arquivo de especificações agora estão passando. Corrigimos um bug na expressão regular que tem o método de vogais, mas nossos testes estão longe de estar completos.

Faria sentido adicionar mais exemplos que testem vários tipos de strings de entrada com o método has vowels.

A tabela a seguir mostra algumas das permutações que podem ser adicionadas em novos exemplos (ele bloqueia)

String de entrada Descrição Resultado esperado com has_vowels?
'aaa', 'eee', 'iii', 'o' Apenas uma vogal e nenhuma outra letra. verdadeiro
'abcefg' 'Pelo menos uma vogal e algumas consoantes' verdadeiro
'mnklp' Apenas consoantes. falso
'' String vazia (sem letras) falso
'abcde55345 & ??' Vogais, consoantes, números e caracteres de pontuação. verdadeiro
'423432 %%% ^ &' Apenas números e caracteres de pontuação. falso
'AEIOU' Apenas vogais maiúsculas. verdadeiro
'AeiOuuuA' Apenas vogais maiúsculas e vogais inferiores. verdadeiro
'AbCdEfghI' Vogais maiúsculas e minúsculas e consoantes. verdadeiro
'BCDFG' Apenas consoantes maiúsculas. falso
'' Apenas caracteres de espaço em branco. falso

Cabe a você decidir quais exemplos adicionar ao seu arquivo de especificações. Existem muitas condições para testar, você precisa determinar qual subconjunto de condições é mais importante e testar seu código da melhor forma.

o rspec comando oferece muitas opções diferentes, para ver todos eles, digite rspec-Socorro. A tabela a seguir lista as opções mais populares e descreve o que elas fazem.

Sr. Não. Opção / sinalizador e descrição
1

-I PATH

Adiciona PATH ao caminho de carregamento (requer) que rspec usa ao procurar por arquivos de origem Ruby.

2

-r, --require PATH

Adiciona um arquivo de origem específico a ser exigido em sua especificação. arquivos).

3

--fail-fast

Com esta opção, o rspec interromperá a execução das especificações após a falha do primeiro exemplo. Por padrão, rspec executa todos os arquivos de especificação especificados, não importa quantas falhas existam.

4

-f, --format FORMATTER

Esta opção permite especificar diferentes formatos de saída. Consulte a seção sobre Formatadores para obter mais detalhes sobre os formatos de saída.

5

-o, --out FILE

Esta opção direciona o rspec para gravar os resultados do teste no arquivo de saída FILE em vez de na saída padrão.

6

-c, --color

Ativa a cor na saída do rspec. Os resultados do exemplo de sucesso serão exibidos em texto verde, as falhas serão impressas em texto vermelho.

7

-b, --backtrace

Exibe backtraces completos de erros na saída do rspec.

8

-w, --warnings

Exibe avisos Ruby na saída do rspec.

9

-P, --pattern PATTERN

Carregue e execute arquivos de especificação que correspondam ao padrão PATTERN. Por exemplo, se você passar -p “* .rb”, rspec executará todos os arquivos Ruby, não apenas aqueles que terminam em “_spec.rb”.

10

-e, --example STRING

Esta opção direciona o rspec para executar todos os exemplos que contêm o texto STRING em suas descrições.

11

-t, --tag TAG

Com esta opção, o rspec executará apenas exemplos que contenham a tag TAG. Observe que TAG é especificado como um símbolo Ruby. Veja a seção sobre Tags RSpec para mais detalhes.