Ruby中的Ruby lambda执行应该在Spec中

时间:2015-11-08 13:38:16

标签: ruby-on-rails ruby rspec lambda

对不起,我是Ruby的新手。

我在RSpec测试中有这样的代码:

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

它不起作用,因为lambda没有“应该”的方法。最重要的是lambda在这种情况下不会执行!我不确定,请告诉我,如果我不对。

然后我尝试这样的代码:

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

并且一切正常,因为我使用方法“call”,因此lambda执行。

我想如果我们使用方法“call”到lambda那么lambda就会执行。

但是后来我为lambda尝试了这样的代码WITHOUT CALL方法:

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

我不使用“call”方法,但不知何故测试通过,这意味着执行了lambda,并且由于没有参数的.new().,抛出了异常。

请帮助我理解为什么在第三种情况下检测到异常是否应该执行lambda?我不使用电话。

在第三种情况下,使用“call”方法结果是相同的,我理解为什么。

感谢您的帮助。

另外还有StringCalculator类的代码:

class StringCalculator

def initialize(x)
    @x = x
end

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

1 个答案:

答案 0 :(得分:1)

raise_error需要一个块来执行,在你的上一个例子中,你给了一个块(即你的lambda)。

在您的第一个示例中,如果您想将<table> <tr> <th>A</th> <th>B</th> <th>C</th> </tr> <tr> <td>a.1</td> <td>b.1</td> <td>c.1</td> </tr> <!-- More rows --> </table> equality matcher一起使用,例如should,您只需:{/ p>

==

顺便说一句,在较新版本的RSpec中,您可以将其写为:

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