要約
RSpec実行時に自動的にロードされるパスがあります。(下記の2つです)
./lib./spec
Railsプロジェクトを触っていると、
そもそもRSpecの自動的にロードされるパスを気にする必要はあまりないのですが、
Rubyのみのプロジェクト + RSpec で動作を確認する時は知っておきたい情報ですね。
これがgem内のどこで設定されているのかを調べました。
ついでに default_path についても記載しています。
対象のバージョン
-
rspec-core:
3.9.2
ロードの設定箇所
では、実際にgem内のどこでパスをロードしているのかを確認します。
$LOAD_PATH に パスを追加するメソッド
$LOAD_PATH に、指定したパスを追加するメソッドは下記のファイルにあります。
def add_to_load_path(*dirs)
dirs.each { |dir| add_dir_to_load_path(File.join(root, dir)) }
end
def add_dir_to_load_path(dir)
$LOAD_PATH.unshift(dir) unless $LOAD_PATH.include?(dir)
end
add_to_load_path メソッドを実行している箇所
add_to_load_path メソッドは、下記のメソッド内で呼び出されています。
['lib', default_path] が add_to_load_pathメソッドの引数になっています。
「default_pathが指定するディレクトリ」と 「'lib'」が $LOAD_PATH に追加されることになります。
def requires=(paths)
directories = ['lib', default_path].select { |p| File.directory? p }
RSpec::Core::RubyProject.add_to_load_path(*directories)
paths.each { |path| load_file_handling_errors(:require, path) }
@requires += paths
end
default_pathの初期値は、下記の箇所で設定されています。
@default_path = 'spec'
上記の requires= メソッドが、
テスト実行時、事前に呼び出されるようになっているので、
lib ディレクトリと spec ディレクトリは
rspec 実行時の $LOAD_PATH に追加されるようになっています。
default_pathを変更する方法
default_pathを変更する場合はどうすればよいのでしょうか?
(必要がなければやらない方がいいとは思いますが・・・。)
例えば、テストファイルを
spec ではなく behavior というディレクトリに置いている場合、
どうすれば default_pathを変更できるでしょうか。
方法1: 実行時にオプションを渡す
テスト実行時にオプションを渡すことで、default_path を指定できます。
$ rspec --default_path behavior
方法2: .rspec を修正
.rspec を下記のどちらかの内容に変更することで、
default_path を指定できます。
実行時、毎回オプションを指定したくない場合はこちらの方法がよいでしょう。
- --require spec_helper
+ RSpec.configure do |config|
+ config.default_path = 'behavior'
+ end
- --require spec_helper
+ --default_path behavior
あとがき
普段はコマンドを実行すればとりあえずテストが流れるので、
中身まで見ることはあまりないです。
調べる過程でいろんなオプションとかを知れて面白かったです。