タイプマッチャー
rspec-expectationsには、オブジェクトのタイプを指定するための2つのマッチャーが含まれています。
expect(obj).to be_kind_of(type)
:obj.kind_of?(type)
を呼び出し、type
がobj
のクラス階層にあるか、またはモジュールであり、obj
のクラス階層のクラスに含まれている場合にtrue
を返します。expect(obj).to be_instance_of(type)
:obj.instance_of?(type)
を呼び出し、type
がobj
のクラスである場合にのみtrue
を返します。
これらのマッチャーには、以下のエイリアスがあります:
expect(obj).to be_a_kind_of(type) # same as expect(obj).to be_kind_of(type)
expect(obj).to be_a(type) # same as expect(obj).to be_kind_of(type)
expect(obj).to be_an(type) # same as expect(obj).to be_kind_of(type)
expect(obj).to be_an_instance_of(type) # same as expect(obj).to be_instance_of(type)
be_(a_)kind_of
マッチャーを使用する場合
次の内容で「be_kind_of_matcher_spec.rb」という名前のファイルがあるとします:
module MyModule; end
class Float
include MyModule
end
RSpec.describe 17.0 do
# the actual class
it { is_expected.to be_kind_of(Float) }
it { is_expected.to be_a_kind_of(Float) }
it { is_expected.to be_a(Float) }
# the superclass
it { is_expected.to be_kind_of(Numeric) }
it { is_expected.to be_a_kind_of(Numeric) }
it { is_expected.to be_an(Numeric) }
# an included module
it { is_expected.to be_kind_of(MyModule) }
it { is_expected.to be_a_kind_of(MyModule) }
it { is_expected.to be_a(MyModule) }
# negative passing case
it { is_expected.not_to be_kind_of(String) }
it { is_expected.not_to be_a_kind_of(String) }
it { is_expected.not_to be_a(String) }
# deliberate failures
it { is_expected.not_to be_kind_of(Float) }
it { is_expected.not_to be_a_kind_of(Float) }
it { is_expected.not_to be_a(Float) }
it { is_expected.not_to be_kind_of(Numeric) }
it { is_expected.not_to be_a_kind_of(Numeric) }
it { is_expected.not_to be_an(Numeric) }
it { is_expected.not_to be_kind_of(MyModule) }
it { is_expected.not_to be_a_kind_of(MyModule) }
it { is_expected.not_to be_a(MyModule) }
it { is_expected.to be_kind_of(String) }
it { is_expected.to be_a_kind_of(String) }
it { is_expected.to be_a(String) }
end
「rspec be_kind_of_matcher_spec.rb」と実行すると、
出力には以下のすべてが含まれている はずです:
| 24個の例、12個の失敗 | | 17.0はFloatの一種であることを期待しました | | 17.0はNumericの一種であることを期待しました | | 17.0はMyModuleの一種であることを期待しました | | 17.0はStringの一種であることを期待しました |
be_(an_)instance_of
マッチャーを使用する場合
次の内容で「be_instance_of_matcher_spec.rb」という名前のファイルがあるとします:
module MyModule; end
class Float
include MyModule
end
RSpec.describe 17.0 do
# the actual class
it { is_expected.to be_instance_of(Float) }
it { is_expected.to be_an_instance_of(Float) }
# the superclass
it { is_expected.not_to be_instance_of(Numeric) }
it { is_expected.not_to be_an_instance_of(Numeric) }
# an included module
it { is_expected.not_to be_instance_of(MyModule) }
it { is_expected.not_to be_an_instance_of(MyModule) }
# another class with no relation to the subject's hierarchy
it { is_expected.not_to be_instance_of(String) }
it { is_expected.not_to be_an_instance_of(String) }
# deliberate failures
it { is_expected.not_to be_instance_of(Float) }
it { is_expected.not_to be_an_instance_of(Float) }
it { is_expected.to be_instance_of(Numeric) }
it { is_expected.to be_an_instance_of(Numeric) }
it { is_expected.to be_instance_of(MyModule) }
it { is_expected.to be_an_instance_of(MyModule) }
it { is_expected.to be_instance_of(String) }
it { is_expected.to be_an_instance_of(String) }
end
「rspec be_instance_of_matcher_spec.rb」と実行すると、
出力には以下のすべてが含まれているはずです:
| 16個の例、8個の失敗 | | 17.0はFloatのインスタンスでないことを期待しました | | 17.0はNumericのインスタンスであることを期待しました | | 17.0はMyModuleのインスタンスであることを期待しました | | 17.0はStringのインスタンスであることを期待しました |