我知道如果预期值是纯假值,则返回true,如果期望值为false或nil,则be_falsey将返回true。
但是,我不明白何时使用其中一个。我没有看到一个例子,其中be_falsey比false更有用。
答案 0 :(得分:2)
Ruby中有很多情况会导致nil
结果,并希望将其视为false
。例如,假设我们有一个处理选项哈希的方法,并且我们希望缺少一个选项与设置为false的选项相同:
def verbose?(opts)
opts[:verbose]
end
opts = { verbose: false }
expect(verbose?(opts)).to be_falsey # => PASS
opts = { verbose: true }
expect(verbose?(opts)).to be_falsey # => FAIL
opts = {}
expect(verbose?(opts)).to be_falsey # => PASS
显然这是一个简单的例子(你可以说verbose?
应该总是返回true
或false
),但类似的场景在Ruby中很常见。
答案 1 :(得分:0)
我能想到的一个例子是方法的单元测试。该方法的使用方式使您对结果不感兴趣,但只关注它是否真实。
考虑一种方法,检查db中是否存在具有给定值的记录:
Class Foo
def self.has_value? value
Foo.find(value: value)
end
此方法将用作:
if Foo.has_value?(value)
...
现在,你可以写一个这样的测试:
let(:foo ){ create :foo )
expect(Foo.has_value?(1)).to == foo
但这掩盖了该方法的意图。该方法的目的不是找到foo。它是告诉你是否存在具有给定值的foo。
为了表达方法的意图,最好使用
expect(Foo.has_value(1).to be_truthy
expect(Foo.has_value(2).to be_falsey
在Rails中,经常使用if model.save
。这是相同的模式。