はじめに
先日、以下の現象が起きました。
・・・
今回のrspecの内容です。
-
describeにitブロックを複数定義 -
subjectで、インスタンスを作成する処理をしている - そのインスタンスが返す値をテストしている
RSpec.describe 'PostShortcode' do
subject { TestPost::Shortcode::PostShortcode.new(params) }
...
it 'hoge' do
expect(subject.hoge).to eq 'hoge'
end
it 'fuga' do
expect(subject.fuga).to eq 'fuga'
end
上記で実行すると、なぜか2回目以降のitの時に、NameError: uninitialized constantが発生します。
NameError:
uninitialized constant TestPost::Shortcode::PostShortcode
1回目のitは、テスト成功します。
2回目以降が、必ず失敗してしまいます...。定義はしているはずなのに...。
今回は、その解決方法をアウトプットいたします。
解決方法
.newするクラスを、RSpec.describeで記載をして、described_classを使用するようにしましょう。
RSpec.describe TestPost::Shortcode::PostShortcode do
subject { described_class.new(params) }
described_classを使用すると、RSpec.describe直後に記載しているクラスを参照してくれます。
ただ、なぜこれで解決したかは謎のままです...。
まとめ
described_classを指定すれば、記載したクラス名を参照してくれるので、シンプルにテストを書くことができます。
ただ、それが今回の解決に繋がったのかは謎のままなので、分かり次第追記していこうと思います。
最後までご覧いただき、ありがとうございました。
参考文献