2017-12-05 6 views
0

TL; DR来年はブーツキャンプに行くつもりですが、その評価はルビーを学ぶことになります。私はJSの背景を持っており、Rubyにはとても新しいです。私はこの評価をしています。その場合、私はテストが私に何をしたいのかよく知らないのです。以下はテストケース(Rspec)で、そのすぐ下に私の答えがあります。このRspec構文は正確に何を求めていますか?

describe "some silly block functions" do 
    describe "reverser" do 
    it "reverses the string returned by the default block" do 
     result = reverser do 
     "hello" 
     end 

    expect(result).to eq("olleh") 
end 

it "reverses each word in the string returned by the default block" do 
    result = reverser do 
    "hello dolly" 
    end 

    expect(result).to eq("olleh yllod") 
    end 
end 

これが私の答えコードです:私はルビーに新しいですし、降伏のアイデアは、JSのためのコールバック関数のようなものである上述したように

def reverser sentence 
    words = sentence.split(" ") 
    result = [] 

    words.length.times do |i| 
    result.push(yield(words[i])) 
    end 

    result.join(" ") 
end 

reverser("hello dolly") {|n| n.reverse} #=> 'olleh yllod' 

。私は、テストケースが私に書いて欲しいと思っているコードを調べるのに苦労しています。これは、 'デフォルトブロックによって返された文字列内の各単語を逆転させる'という文から、単語が逆転している関数の外にブロックを作成したことを示しています。助言を与えることができる人からの助けと指導に感謝します。

答えて

5

これはRubyよりもTDDのほうがずっとです。このアプローチは他のどの言語でも同じです。

TDDのポイントは、失敗する可能性のある最も単純なテストを作成し、エラーメッセージを変更する可能性のある最も単純なコードを書くことです。この例ではステップ#1はすでに提供されていますので、実際にはステップ#2についてです:メッセージを変更する可能性のある最も単純なコードを記述します。

テストを実行しましょう!メッセージには、

NoMethodError: 
    undefined method `reverser' … 

というメッセージが表示されます。メソッドが存在しない可能性があるというメッセージを変更する可能性があります。もちろん、メソッドが存在するようにしてください!

expected: "olleh" 
    got: nil 

わかりましたので、それは、私たちは、文字列'olleh'を返すことが期待されるが、私たちは実際にnilを返しました:

def reverser; end 

は今、メッセージです。簡単です:

def reverser; 'olleh' end 

素晴らしい!最初のテストは合格です。しかし、2番目はまだ失敗します。それは言う:

expected: "olleh yllod" 
    got: "olleh" 

Hmm ...明らかに、静かに何かを返すだけでは不十分です。毎回違うものを返さなければならない。明白なソースは引数ですが、メソッドにはパラメータがありません。それとも?はい! Rubyでは、すべてのメソッドに暗黙のブロックパラメータがあります。あなたはyieldキーワードを使用して、それを評価し、その者はそれを試してみましょうことができます。

def reverser; yield end 

くそー!私たちは2つのエラーに戻ります!それは後退した一歩でした。それとも?最初のエラーメッセージを見てみましょう:

expected: "olleh" 
    got: "hello" 

何か気付いていますか?期待値は、現在返されている値の逆です。戻り値を逆にするだけで済みます:

def reverser; yield.reverse end 

Hooray! 1エラーに戻ります:

expected: "olleh yllod" 
    got: "yllod olleh" 

もう一度、何が起こっているのが見えますか?言葉の順序が逆転している!単語を区切り、それらを逆にして一緒に戻す必要があります。

def reverser; yield.reverse.split.reverse.join end 

だからこそ!

def reverser; yield.reverse.split.reverse.join(' ') end 

Yippieh:私達はちょうどに戻ってスペースを配置する必要があり

expected: "olleh yllod" 
    got: "ollehyllod" 

2 examples, 0 failures 

重要なことは、次のとおりです。どの時点で、我々は実際にに持っていなかったを考えます。道のりのすべてのステップは、テストは、私たちに何をすべきか、次に何をするか、そしていつ行われたかを教えてくれました。それはTDDのことです:テストドライブ開発。

+0

これは本当に興味深い解決策です。私は本当に 'result = reserver {" hello dolly "}"がテストケースの入力であるとは考えていませんでした。徹底的な説明をありがとう! – Ken

0

yieldは「ブロック内でコードを実行して結果を教えてください」という意味です。あなたのreverser方法は、単純に次のように書くことができます。

def reverser 
    yield.split.map(&:reverse).join(' ') if block_given? 
end 

result = reverser do 
    'hello world' 
end 

puts result 
# => olleh dlrow 

Rubyは、自動的に戻り値として呼ばれる最後のものを返すので、reverserに与えられたブロックの戻り値はyieldに割り当てされるものであるhello worldです。

block_given?hereのドキュメントを確認できます。ブロックの詳細については、this answerをご覧ください

+0

'split'は機能的に' split( '') 'と同等です。 – moveson

0

私は、ブートキャンプに行く場合は、RSpecとTDDについて説明することが重要だと思います。私はあなたにこの問題に対する答えを与えることは、あなたがこの場合に知る必要があるものの一部に過ぎないと思う。だから...

TDDの原則の1つは、テストに合格するためのコード量を最小限に抑えることです。私が最初に戻るなら。

def reverser sentence 
    'olleh' 
end 

テストを実行し、テストがエラーで失敗する必要があります:wrong number of arguments

あなたは、引数としてsentenceを取るreverser方法を書かれています。引数を削除して、それを試してみて、もう一度RSpecのを実行します。

def reverser 
    'olleh' 
end 

最初のテストに合格しなければなりませんが、私たちはollehの戻り値をハードコードされてきたように、第2のテストを失敗します。明らかに、ハードコーディングされた値を返すのは良いことではありません。テストをパスするだけで済みました。だから、返り値をyieldにする必要があります。

def reverser 
    yield.reverse 
end 

そして、これはおそらく、第二の試験に合格するでしょう...

これは、TDDの基本理念である、小さなステップを取ると、あなたのコードを渡してもらいます。合格したら、リファクタリングしてコードを改善してください。

TDDは既に良い品質のコードを書く上で非常に貴重です。コードを書くのが楽しくなり、リファクタリングに役立ちます。

私はいくつかのresourcesでページを発見し、私はcodeschoolをお勧めしますが、彼らは残念ですが、便利かもしれませんPluralSight TDD courseがあるともあなたを与えることにあまりにも役に立つかもしれないUdemy course on TDDがある彼らのコースを引退しましたヘッドスタート。

関連する問題