断言布尔方法有什么意义?

时间:2012-10-09 07:48:07

标签: ruby rspec

昨天我和我的一个朋友讨论过这个问题,我们没有得出结论。在我们使用RSpec测试布尔方法时,我想知道使用的重点是什么:

it 'should process the payment' do
    payment.processed?.should eq(true)
end

该步骤必须检查付款是否已处理,所以我只是去了:

it 'should process the payment' do
    payment.processed?
end

现在,我可能在这方面做错了,但是,步骤在某种程度上就像你希望它们返回true的布尔方法一样,所以我想知道检查“真实是真的”是什么意思,我的意思是你已经得到了真实的,对吗?

那么,您怎么看?

3 个答案:

答案 0 :(得分:3)

规范布尔方法(arbitrary predicates)的惯用方法是:

it 'should process the payment' do
  payment.should be_processed
end

请注意,您的第二个代码段不会调用rspec期望,因此它不会测试任何内容(其他代码已成功执行)。我认为您假设it块检查其返回值,但事实并非如此。

答案 1 :(得分:2)

 it "should process the payment" do
  payment.should be_processed
end

如果你有一个be_xxx形式的匹配器(除非有更具体的设置),rspec将检查subject.xxx?是否真实。

如果您的规范中没有应该调用,那么您没有测试任何内容:如果已处理?返回false,规范将通过

答案 2 :(得分:2)

步骤不是期望返回true的布尔方法。所有操作都在should方法中进行 - 它执行测试并确定成功或失败。

这就是为什么你可以在一个should块中拥有多个it的原因(尽管通常最好不要,如果可以避免的话)。

例如:

it "doesn't use return values" do
  false.should be_true  # the test fails immediately here
  true.should be_true   # this never gets called
end

我还建议重写以使用tokland建议的be_processed方法。