RSpec stub_constで定数をスタブするとClassがModuleになる

タイトルのままですね。

特定の条件下で、stub_constを利用するとClassがModuleになってしまいます。

解決策としては、stub_constでクラスを式展開で先に宣言することで動くようになります。

stub_const('Model::CONST', 2) # ダメ

stub_const("#{Model}::CONST", 2) # 式展開で呼び出す

以下、該当Issueの要約です。

定数が定義されているClassを呼び出す前に、stub_constでスタブしてしまうとmoduleとなってしまう。

開発者であるMyron Marston さんは、この動作は理想的ではないが、RSpecが情報を制限されたさせた状態で動いている以上

この動作は仕方ないので、現状のところ修正する気はないようです。

Myron Marston さんは、require "model" のように先にClassを宣言してあげることを提案しています。

他のコメントにて、式展開という解決策が提案されています。

require "model" はstub_constと行が離れてしまうため、該当Issueのリンクをコメントとして残し、式展開することでテストを通しました。

しかし、あまり綺麗な実装方法とは言えないので実力をつけて解決方法を提案したい。

github.com

Effective Testing with RSpec 3: Build Ruby Apps with Confidence (English Edition)

Effective Testing with RSpec 3: Build Ruby Apps with Confidence (English Edition)