在rspec中是假的vs be_falsey

时间:2014-11-17 17:52:21

标签: ruby rspec

我知道如果预期值是纯假值,则返回true,如果期望值为false或nil,则be_falsey将返回true。

但是,我不明白何时使用其中一个。我没有看到一个例子,其中be_falsey比false更有用。

2 个答案:

答案 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?应该总是返回truefalse),但类似的场景在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。这是相同的模式。