RSpec/Rails: uninitialized constant が出たら bin/spring stop を実行してみると吉
Rails 4 になってから RSpec で書かれたテストを実行した際に、uninitialized constant Admin
のようなエラーが出ることがあります。Rails アプリケーションのソースコードで Admin
というクラスなりモジュールなりは定義されているというのに。
この場合、とりあえず bin/spring stop
を実行してみましょう。たぶん、一発で効き目があります。
この現象は、app
ディレクトリに新たなサブディレクトリ(たとえば、sevices
)を追加したときに発生します。
前回の bin/rspec
コマンド実行時に読み込んだRailsアプリケーションがメモリ上に残っているため、app/services
ディレクトリが自動読み込みの対象になりません。
実は、この現象に気付いたのは、拙著『実践Ruby on Rails 4 現場のプロから学ぶ本格Webプログラミング』の読者(複数)からの質問がきっかけでした。手順通り進めてもエラーが出てしまう、ということでした。
当初、私の環境ではうまく再現せず、その旨を返信すると、読者の方でもテストが通ったという回答が届くので、何らかの勘違いだろうと考えていたのですが、同様の質問が続くため、いろんな仮説を立てて検証してみたところ、エラーの再現と回避に成功しました。