RSpec: Как проверить тип логического возврата?

Я использую RSpec для тестирования API. Я хочу указать, что одна конкретная конечная точка возвращает логическое значение, либо true, либо false. Это API, который будет использоваться другими системами и языками, поэтому важно, чтобы он был фактическим булевым, а не просто тем, что Ruby будет оценивать с помощью false или true.

Но я не вижу способа сделать это, потому что в Ruby нет типа Boolean.

Ответ 1

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

Ответ 2

У меня была та же проблема. Вот что я придумал:

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

Ответ 3

В более поздних версиях rspec можно использовать составные сокеты:

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

Ответ 4

Хотя Ruby не имеет класса Boolean, он имеет TrueClass и FalseClass, из которых 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

Ответ 5

Это долгое время, но здесь я решил:

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

Это работает, потому что true и false имеют только один экземпляр. Кроме того, больше любопытства, но они также всегда имеют одинаковый идентификатор экземпляра.

Ответ 6

Как насчет комбинации вышеуказанного?

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

использование:

expect(something).to be_boolean

Ответ 7

Добавьте gem rspec_boolean в ваш Gemfile в группе: development,: test:

gem 'rspec_boolean'

И чем использовать его как:

ожидать (val.is_done).to be_boolean