3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

RSpecの自動的にロードされるパスについて

Last updated at Posted at 2020-07-28

要約

RSpec実行時に自動的にロードされるパスがあります。(下記の2つです)

  • ./lib
  • ./spec

Railsプロジェクトを触っていると、
そもそもRSpecの自動的にロードされるパスを気にする必要はあまりないのですが、
Rubyのみのプロジェクト + RSpec で動作を確認する時は知っておきたい情報ですね。

これがgem内のどこで設定されているのかを調べました。
ついでに default_path についても記載しています。

対象のバージョン

ロードの設定箇所

では、実際にgem内のどこでパスをロードしているのかを確認します。

$LOAD_PATH に パスを追加するメソッド

$LOAD_PATH に、指定したパスを追加するメソッドは下記のファイルにあります。

lib/rspec/core/ruby_project.rb
      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 に追加されることになります。

lib/rspec/core/configuration.rb
      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の初期値は、下記の箇所で設定されています。

lib/rspec/core/configuration.rb
        @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 を指定できます。
実行時、毎回オプションを指定したくない場合はこちらの方法がよいでしょう。

.rspec
- --require spec_helper
+ RSpec.configure do |config|
+  config.default_path = 'behavior'
+ end
.rspec
- --require spec_helper
+ --default_path behavior

あとがき

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

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?