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. |