はじめに
先日、以下の現象が起きました。
・・・
今回の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
を指定すれば、記載したクラス名を参照してくれるので、シンプルにテストを書くことができます。
ただ、それが今回の解決に繋がったのかは謎のままなので、分かり次第追記していこうと思います。
最後までご覧いただき、ありがとうございました。
参考文献