2017-09-12 17 views
0

今のところ私はルビーを学んでおり、rspecとBDDを使ってアプリケーションを開発する方法を学びたいと思っています。私が書く行動で思うのは難しいです。>それを方向づけます。私はrspecのためのいくつかの簡単な初心者のチュートリアルを見つけましたが、私がクラスなしで小さなプログラムを構築した私のケースではあまり役に立ちません。rspecでルビープログラムをテストする

これは私のコードです。シンプルなシーザー暗号回転プログラム速いブリーフィング...ユーザがROTに0〜26の文字を入力し、例えば "ROT24 some text" を入力すると、入力が適切にフォーマットされ、範囲内であるかどうかをチェックし、ROTワードの後ろの数字に応じてテキストの文字を回転させる。例ROT5はアルファベット順に5つの文字を回転します。

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 

誰もが(もしこの貧しい魂のためにいくつかの暇な時間を持っている)、このコードのRSpecのテストを書くことができますので、私はそれをリバースエンジニアリングすることができますか?私はいくつかのことを試しましたが、とりわけ私はユーザーの入力と混同しています。テスト中に、私には意味をなさない入力を実際に行うよう求めています。

ありがとうございます。

答えて

2

まずは、独自のクラスにコードをリファクタリングしましょう:

我々はRSpecの宝石をインストールする必要があります10 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 

次へ:

$ gem install rspec 

はのは仕様ディレクトリを追加し、そこにRSpecのファイルを作成してみましょう:

スペック/ 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 

プロジェクトフォルダ内のコマンドラインから、rspec:を実行してください0 を生じるはずである

$ rspec 

.. 

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

まず、実際にテストするコードの部分を別のファイルに分割して、コードをクラスに入れたいと思うでしょう。 requireあなたが実行しているファイル内のコードは、入力からデータを受け入れ、そのデータを渡すことができます。同時に、specファイルはファイルもrequireになり、クラス内のメソッドに対してspecを実行します。次のようになります。

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) 
関連する問題