RSpec - Specifiche di scrittura
In questo capitolo, creeremo una nuova classe Ruby, la salveremo nel suo file e creeremo un file spec separato per testare questa classe.
Innanzitutto, nella nostra nuova classe, si chiama StringAnalyzer. È una classe semplice che, hai indovinato, analizza le stringhe. La nostra classe ha un solo metodohas_vowels?che, come suggerisce il nome, restituisce true se una stringa contiene vocali e false se non lo fa. Ecco l'implementazione perStringAnalyzer -
class StringAnalyzer
def has_vowels?(str)
!!(str =~ /[aeio]+/i)
end
end
Se hai seguito la sezione HelloWorld, hai creato una cartella chiamata C: \ rspec_tutorial \ spec.
Elimina il file hello_world.rb se ce l'hai e salva il codice StringAnalyzer sopra in un file chiamato string_analyzer.rb nella cartella C: \ rspec_tutorial \ spec.
Ecco la fonte del nostro file delle specifiche per testare 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
Salvarlo nella stessa directory delle specifiche, assegnandogli il nome string_analyzer_test.rb.
Nella finestra cmd.exe, accedi alla cartella C: \ rspec_tutorial ed esegui questo comando: dir spec
Dovresti vedere quanto segue:
Directory di 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
Ora eseguiremo i nostri test, eseguiamo questo comando: rspec spec
Quando passi il nome di una cartella a rspec, esegue tutti i file delle specifiche all'interno della cartella. Dovresti vedere questo risultato -
No examples found.
Finished in 0 seconds (files took 0.068 seconds to load)
0 examples, 0 failures
Il motivo per cui ciò è accaduto è che, per impostazione predefinita, rspecesegue solo file i cui nomi terminano con "_spec.rb". Rinomina string_analyzer_test.rb in string_analyzer_spec.rb. Puoi farlo facilmente eseguendo questo comando:
ren spec\string_analyzer_test.rb string_analyzer_spec.rb
Adesso corri rspec di nuovo spec, dovresti vedere un output simile a questo -
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)
Ora, salva le modifiche che hai appena fatto in string_analyizer.rb ed esegui di nuovo il comando rspec spec, ora dovresti vedere l'output che assomiglia a -
..
Finished in 0.002 seconds (files took 0.11401 seconds to load)
2 examples, 0 failures
Congratulazioni, ora gli esempi (test) nel file delle specifiche vengono superati. Abbiamo corretto un bug nell'espressione regolare che ha il metodo delle vocali ma i nostri test sono lungi dall'essere completi.
Avrebbe senso aggiungere altri esempi che testino vari tipi di stringhe di input con il metodo has vowels.
La tabella seguente mostra alcune delle permutazioni che potrebbero essere aggiunte in nuovi esempi (blocca)
Stringa di input | Descrizione | Risultato previsto con has_vowels? |
---|---|---|
"aaa", "eee", "iii", "o" | Solo una vocale e nessun'altra lettera. | vero |
"abcefg" | 'Almeno una vocale e alcune consonanti' | vero |
"mnklp" | Solo consonanti. | falso |
'' | Stringa vuota (senza lettere) | falso |
"abcde55345 & ??" | Vocali, consonanti, numeri e caratteri di punteggiatura. | vero |
"423432 %%% ^ &" | Solo numeri e caratteri di punteggiatura. | falso |
"AEIOU" | Solo vocali maiuscole. | vero |
"AeiOuuuA" | Solo vocali maiuscole e minuscole. | vero |
"AbCdEfghI" | Vocali e consonanti maiuscole e minuscole. | vero |
"BCDFG" | Solo consonanti maiuscole. | falso |
'' | Solo caratteri di spazio vuoto. | falso |
Sta a te decidere quali esempi aggiungere al file delle specifiche. Esistono molte condizioni da verificare, è necessario determinare quale sottoinsieme di condizioni è più importante e testare il codice al meglio.
Il rspec Il comando offre molte opzioni diverse, per vederle tutte, digita rspec-Aiuto. La tabella seguente elenca le opzioni più popolari e descrive cosa fanno.
Sr.No. | Opzione / bandiera e descrizione |
---|---|
1 | -I PATH Aggiunge PATH al percorso di caricamento (richiesto) that rspec utilizza quando si cercano i file sorgenti di Ruby. |
2 | -r, --require PATH Aggiunge un file di origine specifico da richiedere nelle specifiche. File). |
3 | --fail-fast Con questa opzione, rspec interromperà l'esecuzione delle specifiche dopo che il primo esempio fallisce. Per impostazione predefinita, rspec esegue tutti i file spec specificati, indipendentemente dal numero di errori presenti. |
4 | -f, --format FORMATTER Questa opzione consente di specificare diversi formati di output. Vedere la sezione sui formattatori per maggiori dettagli sui formati di output. |
5 | -o, --out FILE Questa opzione indica a rspec di scrivere i risultati del test nel file di output FILE invece che nell'output standard. |
6 | -c, --color Abilita il colore nell'output di rspec. I risultati di esempio riusciti verranno visualizzati in testo verde, gli errori verranno stampati in testo rosso. |
7 | -b, --backtrace Visualizza tutti i backtrace degli errori nell'output di rspec. |
8 | -w, --warnings Visualizza gli avvisi di Ruby nell'output di rspec. |
9 | -P, --pattern PATTERN Carica ed esegui i file delle specifiche che corrispondono al pattern PATTERN. Ad esempio, se passi -p "* .rb", rspec eseguirà tutti i file Ruby, non solo quelli che terminano con "_spec.rb". |
10 | -e, --example STRING Questa opzione indica a rspec di eseguire tutti gli esempi che contengono il testo STRING nelle loro descrizioni. |
11 | -t, --tag TAG Con questa opzione, rspec eseguirà solo esempi che contengono il tag TAG. Nota che TAG è specificato come un simbolo Ruby. Vedere la sezione sui tag RSpec per maggiori dettagli. |