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

Dog*_*her 19 boolean rspec

我正在使用RSpec来测试API.我想指定一个特定端点返回一个布尔值,true或者false.这是由其他系统和语言使用的API,所以它是一个真正的布尔值,并非只是某种红宝石将评估到这一点很重要falsetrue.

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

小智 30

expect(variable).to be_in([true, false])
Run Code Online (Sandbox Code Playgroud)

  • 在这里没有工作:'期望真的回应'in?'` (9认同)

Rim*_*ian 23

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

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

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

它可以像这样使用:

it 'is boolean' do
  expect(true).to be_boolean
end
Run Code Online (Sandbox Code Playgroud)

  • 旨在为遵循RSpec约定的OP定义通用,可重用的解决方案。我个人唯一要更改的就是使用@tomasz的`be_in([true,false])`有条件的而不是`satisfy`块,因为它是如此简洁明了。 (2认同)

fph*_*ipe 10

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

expect(thing).to be(true).or be(false)
Run Code Online (Sandbox Code Playgroud)

  • 好的。如果没有空格,“be(true).or(be(false))”,这也适用于“match”匹配器(https://relishapp.com/rspec/rspec-expectations/v/2-99/docs /内置匹配器/匹配匹配器)。 (2认同)

Rui*_*nes 6

如何组合以上?

RSpec::Matchers.define :be_boolean do
  match do |value|
    [true, false].include? value
  end
end
Run Code Online (Sandbox Code Playgroud)

用法:

expect(something).to be_boolean
Run Code Online (Sandbox Code Playgroud)