2013-05-01 38 views
1

以下是來自Test-First.org的練習#5(愚蠢塊)的一部分,我嘗試在學習時嘗試破解我自己,準備一個Ruby類。初學者RSpec:需要幫助編寫Ruby代碼來通過RSpec測試(傻瓜塊練習)

每個練習都附帶一個RSpec'_spec.rb'文件,用戶需要編寫相應的Ruby代碼'.rb'文件,並繼續「耙」它直到所有RSpec測試(示例)都是滿意。至少這是我的解釋,並且我已經能夠完成前四個練習,但是,本練習中的RSpec語法讓我難以置信。 (不幸的是,我不僅僅是編程方面的新手,我對RSpes來說絕對是新手,我還沒有能夠在線找到一個很好的新手級RSpec/TDD介紹)。

因此,我希望RSpec專家可能會提供幫助。基本上,我想知道下面的RSpec語法告訴我寫代碼的究竟是什麼?

require "silly_blocks" 

describe "some silly block functions" do 

    describe "reverser" do 
    it "reverses the string returned by the default block" do 
     result = reverser do 
     "hello" 
     end 
     result.should == "olleh" 
    end 
... 

我認爲我寫了一個叫做「反向」,它接受一個字符串參數的方法,並返回刺痛逆轉,如:

def reverser(string) 
    return string.reverse 
end 

唉,這顯然是不正確的 - 耙悲慘的失敗了:

some silly block functions 
    reverser 
    reverses the string returned by the default block (FAILED - 1) 

Failures: 

    1) some silly block functions reverser reverses the string returned by the def 
ault block 
    Failure/Error: result = reverser do 
    ArgumentError: 
     wrong number of arguments (0 for 1) 
    # ./05_silly_blocks/silly_blocks.rb:3:in `reverser' 
    # ./05_silly_blocks/silly_blocks_spec.rb:15:in `block (3 levels) in <top (r 
equired)>' 

我懷疑它是與傳遞「默認代碼塊」,但我不知道如何結構。在這個練習中有更多的寫法,但是,如果我能夠弄清楚最初的一個,我想我可以解決其餘的問題!

非常感謝Danke sehr,Muchas gracias !! :)

回答

5

據我所知,由於此方法需要一個塊並對其執行某些操作,因此您需要定義採用塊的方法而不是參數。因此,爲了使該方法做到這一點:

reverser do 
    "hello" 
end 

你會寫是這樣的:

def reverser 
    yield.reverse 
end 

或:

def reverser(&block) 
    block.call.reverse 
end 

現在,當塊通過上述方法將工作它:reverser { "hello" },但不使用參數時:reverser("hello")

+2

好答案;我會補充說,除非你只是簡單地調用它,否則你應該更喜歡第一個版本(帶'yield')。 – 2013-05-01 13:28:46

+0

感謝您的澄清。 – 2013-05-01 13:47:22

+0

@ mind.blank:謝謝,就是這樣! RSpec文件進行測試,所以在我的情況下,我實際上並不需要調用該方法。找到一個RSpec介紹截屏,會給它一個旋風。 – pete 2013-05-01 20:14:45