要約
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
あとがき
普段はコマンドを実行すればとりあえずテストが流れるので、
中身まで見ることはあまりないです。
調べる過程でいろんなオプションとかを知れて面白かったです。