今回は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()メソッドを介してグループ化されます。
例を見てみましょう。
以下のコードでは、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を用いてコードを書いていきましょう。