2015-11-08 32 views
2

對不起,我在Ruby中是新手。紅寶石拉姆達與執行應當規格

我在RSpec的測試這樣的代碼:

it "if Add get empty string as parameter return 0" do 
     lambda { StringCalculator.new(5).Add("") }.should == 0 
end 

它不起作用,因爲拉姆達沒有一個方法,「應該」。最重要的是lambda不會在這種情況下執行!我不確定,請告訴我,如果我不對。

然後我嘗試這樣的代碼:

it "if Add get empty string as parameter return 0" do 
     lambda { StringCalculator.new(5).Add("") }.call.should == 0 
end 

,一切都還好,因爲我使用的方法「呼叫」並因此拉姆達執行。

我想如果我們使用lambda方法「調用」,那麼lambda執行。

但後來我嘗試這樣的代碼,而無需調用方法的拉姆達:

it "if Add get empty string as parameter return 0" do 
     lambda { StringCalculator.new().Add("") }.should raise_exception ArgumentError 
end 

我不使用「呼」的方法,但不知何故測試通過,就意味着拉姆達被執行,因爲.new().與沒有參數,拋出異常。

請幫我理解爲什麼在第三種情況下檢測到異常,如果lambda不應該被執行?我不使用電話。

在接受「呼」的方法結果第三種情況是一樣的,我明白爲什麼。

感謝您的幫助。

在StringCalculator類的附加碼:

class StringCalculator 

def initialize(x) 
    @x = x 
end 

def Add(str) 
    if str == "" 
     0 
    end 
end 
end 

回答

1

raise_error需要一個塊來執行,並在最後一個例子,你給一個塊(即你的拉姆達)。

在你的第一個例子,如果你想使用shouldequality matcher,如==你只需要:

StringCalculator.new(5).Add("").should == 0 

順便說一句,在RSpec中的較新版本,你會寫爲:

expect(StringCalculator.new(5).Add("")).to eq 0