2017-09-12 3 views
0

In diesem Moment lerne ich Ruby, und ich möchte lernen, wie man Apps mit rspec und BDD entwickelt, aber ich habe noch nie irgendwelche Tests gemacht. Es ist schwer für mich, im Schreibverhalten zu denken -> mach es dir in die richtige Richtung. Ich habe einige einfache Anfänger-Tutorials für rspec gefunden, aber nicht so hilfreich in meinem Fall, wo ich ein kleines Programm ohne Klassen gebaut habe.Ruby-Programm testen mit rspec

Dies ist mein Code. Einfaches Cesar-Chiffre-Rotationsprogramm. Schnell kurz ... wenn der Benutzer ROT mit 0-26 und Text zum Beispiel "ROT24 etwas Text" eingibt, prüft er, ob die Eingabe richtig formatiert und innerhalb von Bereichen ist, und dreht dann Zeichen in Text abhängig von dieser Nummer nach dem ROT-Wort. Beispiel ROT5 dreht Zeichen für 5 Spots in alphabetischer Reihenfolge.

i=0 
#check input 

while true 

puts 
    if i>0 
     puts "Wrong Entry Please Try Again!" 

     puts "Input Decipher key in ROT0-ROT26 format and text to decipher using white space between. Example (ROT2 SomeText)" 
     input=gets.chop 

    else 
     puts "Input Decipher key in ROT0-ROT26 format and text to decipher using white space between. Example (ROT2 SomeText)" 
     input=gets.chop 
     i+=1 
    end 

break if input.match(/\AROT([0-9]|1[0-9]|2[0-6]) /) 

end 



#splitting input 
inputArray=input.split(" ",2) 

inputFirstPart= inputArray[0] 

inputKey=inputFirstPart[3..4].to_i 

inputText= inputArray[1] 

#cipher method 
def rotate (str,num) 

    alphabetLow = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"] 
    alphabetUp = ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"] 
    second_step=str.tr(alphabetLow.join,alphabetLow.rotate(num).join) 
    second_step.tr(alphabetUp.join,alphabetUp.rotate(num).join) 

end 
#output result 
print "Your result is: " 
print rotate(inputText,inputKey) 
puts 

Kann jemand (wenn etwas Freizeit für diese arme Seele haben) schreiben Sie rspec Test für diesen Code, damit ich es rückentwickeln kann? Ich habe einige Sachen versucht, aber vor allem bin ich mit Benutzereingaben verwirrt, weil während des Tests sein Bitten mich, tatsächlich die Eingabe zu tun, die keinen Sinn für mich macht.

Vielen Dank im Voraus.

Antwort

2

Zuerst lassen Sie uns Ihren Code in eine eigene Klasse Refactoring :

caesar.rb

class Caesar 
    def self.rotate (str, num) 
    alphabet_low = ('a'..'z').to_a # Shorthand for alphabet creation, thanks Ruby! 
    alphabet_high = ('A'..'Z').to_a 

    second_step = str.tr(alphabet_low.join, alphabet_low.rotate(num).join) 
    second_step.tr(alphabet_high.join, alphabet_high.rotate(num).join) 
    end 
end 

Als nächstes müssen wir die rspec Juwel installieren:

$ gem install rspec 

Lassen Sie uns ein spec Verzeichnis hinzufügen und eine rspec Datei dort erstellen:

spec/caesar_spec.rb

require_relative '../caesar' 

describe Caesar do 
    describe '.rotate' do 
    context 'when number 0 is provided' do 
     let(:number) { 0 } 

     it 'returns the same text that is provided' do 
     string = 'Hello World' 
     expect(Caesar.rotate(string, number)).to eq('Hello World') 
     end 
    end 

    context 'when number 1 is provided' do 
     let(:number) { 1 } 

     it 'encrypts the given string by rotating it a single character' do 
     string = 'Hello World' 
     expect(Caesar.rotate(string, number)).to eq('Ifmmp Xpsme') 
     end 
    end 
    end 
end 

nun von der Kommandozeile in Ihrem Projektordner, führen Sie einfach rspec:

$ rspec 

, die in Folge sollte:

.. 

Finished in 0.00222 seconds (files took 0.09387 seconds to load) 
2 examples, 0 failures 
1

Zuerst werden Sie den Teil des Codes, den Sie tatsächlich testen möchten, in eine separate Datei aufteilen, die den Code in eine Klasse einordnet. Sie können dann require diesen Code in der Datei, die Sie ausführen, Daten aus der Eingabe akzeptieren und diese Daten an sie übergeben. Zur gleichen Zeit wird die Spezifikationsdatei require auch die Datei, und führen Sie Spezifikationen gegen die Methoden in der Klasse. Könnte etwa so aussehen:

rotator.rb:

class Rotator 
    def rotate(str, num) 
     #do stuff 
    end 
end 

rotator_spec.rb

require_relative 'rotator' 
describe Rotator do 
    it 'rotates' do 
     expect(described_class.new.rotate('a', 'b')).to eq 'result' 
    end 
end 

run.rb

require_relative 'rotator' 
rotator = Rotator.new 
#do input stuff 
puts rotator.rotate(inputText, inputKey)