2015-11-08 36 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