24

我正在使用 RSpec 来测试 API。我想指定一个特定的端点返回一个布尔值,要么true要么false。这是一个供其他系统和语言使用的 API,因此它是一个实际的布尔值很重要,而不仅仅是 Ruby 将评估为falseor的东西true

但我看不到这样做的方法,因为BooleanRuby 中没有类型。

4

7 回答 7

36
expect(variable).to be_in([true, false])
于 2015-10-29T15:35:22.777 回答
24

我有同样的问题。这就是我想出的:

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
于 2014-03-26T09:05:36.477 回答
16

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

expect(thing).to be(true).or be(false)
于 2016-09-06T16:09:51.940 回答
7

以上的组合如何?

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

用法:

expect(something).to be_boolean
于 2016-06-13T15:22:44.473 回答
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
于 2012-11-14T01:17:15.287 回答
2

很久以后,但这是我决定的:

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

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

于 2013-08-16T04:33:38.747 回答
1

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

宝石'rspec_boolean'

而不是像这样使用它:

期望(val.is_done).to be_boolean

于 2015-09-16T07:33:18.467 回答