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

RSpec:如何测试布尔返回类型?,rspec,boolean,Rspec,Boolean,我正在使用RSpec测试一个API。我想指定一个特定端点返回一个布尔值,true或false。这是一个供其他系统和语言使用的API,因此它必须是一个实际的布尔值,而不仅仅是Ruby将计算为false或true 但是我看不出有什么方法可以做到这一点,因为Ruby中没有Boolean类型。虽然Ruby没有Boolean类,但它确实有and,其中true和false是唯一的实例。我相信你可以和这两个人中的任何一个进行测试,并且可以很好地进行测试 true.is_a? TrueClass # =>

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


但是我看不出有什么方法可以做到这一点,因为Ruby中没有
Boolean
类型。

虽然Ruby没有
Boolean
类,但它确实有and,其中
true
false
是唯一的实例。我相信你可以和这两个人中的任何一个进行测试,并且可以很好地进行测试

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

很长一段时间后,我决定:

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

这是因为true和false只有一个实例。另外,更奇怪的是,它们也总是有相同的实例id。

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

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

它可以这样使用:

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

将gem rspec_布尔值添加到组:development,:test:

gem'rspec_boolean'

然后像这样使用它:


expect(val.is_done)。要成为布尔值

如何组合上述各项

expect(variable).to be_in([true, false])
RSpec::Matchers.define :be_boolean do
  match do |value|
    [true, false].include? value
  end
end
用法:

expect(something).to be_boolean

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

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

将两者结合在一起的完整规范看起来会是什么样子?它不会有什么特别的地方,只需从API中获取结果并执行如下操作:
[TrueClass,FalseClass]。应该包括(result.class)
,甚至应该包括(result.is|a?TrueClass | result.is|a?FalseClass)。应该是[TrueClass,FalseClass]。应该包括(result.class)或甚至(result.is|u?TrueClass | result.is|u?FalseClass).should be_true在rspec2中有语法错误且不起作用。API是否返回字符串?JSON?似乎您应该测试API使用者将看到的相同内容,例如“true”为true。我的问题在这里有很多很好的答案。就我个人而言,我最喜欢这个,因为它简单明了。在这里不起作用:
预期true为true响应“in?”
@brauliobo您需要rails(或至少是积极的支持)的支持,以便为OP定义一个通用的、高度可重用的解决方案,该解决方案遵循RSpec的约定。我个人唯一要做的改变是使用@tomasz的
be_in([对,错])
条件而不是
满足
块,因为它非常简洁明了。好主意!完成。很好。没有空格,
be(true)或(be(false))
,这也适用于
匹配
匹配器()。