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プログラミング』の読者(複数)からの質問がきっかけでした。手順通り進めてもエラーが出てしまう、ということでした。

当初、私の環境ではうまく再現せず、その旨を返信すると、読者の方でもテストが通ったという回答が届くので、何らかの勘違いだろうと考えていたのですが、同様の質問が続くため、いろんな仮説を立てて検証してみたところ、エラーの再現と回避に成功しました。