rubyでrspecを使ったときに、requireのパス指定をシッカリ考える

rubyrspecを使ったときに、requireのパスがあれ?って思ったの。 今、life_gemeの実装をrubyでしていた、testはrspecを使っているんだけど、rspecからクラスのファイルを読み込むときに、「.」付けるのと、付けないのの違いってなんだ?って思って調べた。

ディレクトリ構造
life_game/
    spec/
        cell_spec.rb
    cell.rb

life_game直下のディレクトリでrspecを実行する

~/workspace/life_game $ rspec

エラー

require "spec_helper"
require "cell" 

正解

require "spec_helper"
require "./cell"

あれ、これなんでspec_helperは「./」いらないんだ?ってなった。

調べていくと、$LOAD_PATHという定義があって、ファイルを読み込むときは、$LOAD_PATHに設定されたディレクトリ内にファイルがあるかを探索する。windowsでもpathを通すとかって言うよね。 そして、rspecは読み込み時に/home/ubuntu/workspace/life_game/spec(cloud9です)を$LOAD_PATHに設定しているので、「./」を打つ必要はないのです。

require "cell"の場合は?
$LOAD_PATH内に設定されたディレクトリ内でcell.rbがあれば読込み、なければエラーです。 そして現状のcell.rbを見るとlife_game/直下に置いているので、$LOAD_PATHからたどれずエラー。

対処方法として

があります。

フワットしてたのが、整理できてよかった。お正月は時間が止まったみたいで心地良い。

参考: Rubyにおけるロードパス(require)のtips | Futurismo Rubyでrbファイルをrequireするときはドットを打つと良さそう - アインシュタインの電話番号 Ruby 普段特に何も考えずに使っていた require について調べてみた - Qiita