RSpec

【RSpec】described_classメソッドを用いて対象クラスを置き換える方法

RSpec

 

今回はRSpecのコード内で対象クラスをdescribed_classに置き換えて記述する方法についてまとめてみました。何度も参照するクラスをdescribed_classで全て統一することができ、クラスの指定ミスも未然に防げそうです。

described_classとは

described_classとは、「RSpec.describe ClassName do」という記述のClassNameを参照するためのメソッドです。

If the first argument to an example group is a class, the class is exposed to
each example in that example group via the described_class() method.

サンプルグループの最初の引数がクラスの場合、その例はdescribed_class()メソッドを介してグループ化されます。

参考: Project: RSpec Core 3.9

 

例を見てみましょう。

以下のコードでは、expectの引数にdescribed_classが書かれています。

RSpec.describe Fixnum do
  describe 'inner' do
    describe String do
      it "is available as described_class" do
        expect(described_class).to eq(String)
      end
    end
  end
end

 

上記コードをdescribed_classを使用せずに書いてみると以下のようになります。

RSpec.describe Fixnum do
  describe 'inner' do
    describe String do
      it "is available as described_class" do
        expect(Fixnum).to eq(String)
      end
    end
  end
end

 

このようにdescribed_classは「RSpec.describe ClassName do」のClassName部分を参照するためのものになります。

RuboCopの監視対象でもある

described_classはRuboCopの監視対象でもあります。

described_classが使用できるにも関わらず、直接クラスを書いてしまった場合はRuboCopの警告が出るので注意しましょう。

Checks that tests use `described_class`.If the first argument of describe is a class, the class is exposed to each example via described_class.This cop can be configured using the `EnforcedStyle` and `SkipBlocks` options.

テストで `describe_class`が使用されていることを確認します。describeの最初の引数がクラスの場合、クラスはdescribe_classを介して各例に公開されます。このCopは、 `EnforcedStyle`および` SkipBlocks`オプションを使用して構成できます。

参考: Class: RuboCop::Cop::RSpec::DescribedClass

まとめ

  • described_classは、「RSpec.describe ClassName do」のClassNameを参照するためのメソッド
  • described_classはRuboCopの監視対象でもある

参考

 

 

今回はRSpecのコード内で対象クラスをdescribed_classに置き換えて記述する方法について解説しました。RSpecのdescribe内でクラスを明示的に書いている場合は、described_classを用いてコードを書いていきましょう。