RSpecを使用してAPIをテストしています。true
1つの特定のエンドポイントがブール値またはのいずれかを返すように指定したいと思いますfalse
。false
これは他のシステムや言語で使用されるAPIであるため、Rubyが評価したり、評価したりするだけでなく、実際のブール値であることが重要ですtrue
。
Boolean
しかし、Rubyにはタイプがないため、これを行う方法がわかりません。
expect(variable).to be_in([true, false])
私も同じ問題を抱えていました。これは私が思いついたものです:
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
最近のrspecバージョンでは、複合マッチャーを使用できます。
expect(thing).to be(true).or be(false)
上記の組み合わせはどうですか?
RSpec::Matchers.define :be_boolean do
match do |value|
[true, false].include? value
end
end
利用方法:
expect(something).to be_boolean
RubyにはBoolean
クラスがありませんが、 TrueClassとFalseClassがあり、true
そのfalse
うちの唯一のインスタンスです。私はあなたがそれらの2つのどちらかに対してテストすることができて、行ってもいいと確信しています。
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にはインスタンスが1つしかないため、これは機能します。また、好奇心が強いですが、常に同じインスタンスIDを持っています。
グループ:development、:test:のGemfileにgemrspec_booleanを追加します。
gem'rspec_boolean'
そしてそれを次のように使用するよりも:
expect(val.is_done).to be_boolean