RSpec:如何测试布尔返回类型?

时间:2012-11-14 01:09:54

标签: rspec boolean

我正在使用RSpec来测试API。我想指定一个特定端点返回一个布尔值,truefalse。这是一个供其他系统和语言使用的API,因此它必须是一个实际的布尔值,而不仅仅是Ruby将评估为falsetrue的内容。

但我没有办法做到这一点,因为Ruby中没有Boolean类型。

7 个答案:

答案 0 :(得分:26)

expect(variable).to be_in([true, false])

答案 1 :(得分:17)

我遇到了同样的问题。这就是我想出的:

RSpec::Matchers.define :be_boolean do
  match do |actual|
    expect(actual).to be_in([true, false])
  end
end

请参阅:https://www.relishapp.com/rspec/rspec-expectations/v/3-4/docs/custom-matchers

可以像这样使用:

it 'is boolean' do
  expect(true).to be_boolean
end

答案 2 :(得分:10)

在最近的rspec版本中,可以使用复合匹配器:

expect(thing).to be(true).or be(false)

答案 3 :(得分:6)

上述组合怎么样?

RSpec::Matchers.define :be_boolean do
  match do |value|
    [true, false].include? value
  end
end

用法:

expect(something).to be_boolean

答案 4 :(得分:2)

虽然Ruby没有Boolean类,但它确实有TrueClassFalseClass,其中truefalse是唯一的实例。我相信你可以对这两种中的任何一种进行测试并且很好。

true.is_a? TrueClass # => true
(1 == 1).is_a? TrueClass # => true
1.is_a? TrueClass # => false

false.is_a? FalseClass # => true
(1 == 2).is_a? FalseClass # => true
nil.is_a? FalseClass # => false

答案 5 :(得分:2)

很久以后,但这就是我所确定的:

foo.should satisfy {|x| [true, false].map(&:object_id).include? x.object_id}

这是有效的,因为true和false只有一个实例。此外,更多的是好奇心,但它们也始终具有相同的实例ID。

答案 6 :(得分:1)

将gem rspec_boolean添加到组中的Gemfile:development,:test:

gem'rspec_boolean'

而不是像使用它一样:

期望(val.is_done).to be_boolean