メインコンテンツまでスキップ

タイプマッチャー

rspec-expectationsには、オブジェクトのタイプを指定するための2つのマッチャーが含まれています。

  • expect(obj).to be_kind_of(type): obj.kind_of?(type)を呼び出し、typeobjのクラス階層にあるか、またはモジュールであり、objのクラス階層のクラスに含まれている場合にtrueを返します。
  • expect(obj).to be_instance_of(type): obj.instance_of?(type)を呼び出し、typeobjのクラスである場合にのみ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のインスタンスであることを期待しました |