5
1

More than 3 years have passed since last update.

【RSpec】ヘルパーで定義したメソッドを読み込まないときの対応

Posted at

はじめに

RSpecでの統合テストをかいているときに、
テスト用ヘルパーに定義したメソッドを読み込んでくれず、エラーになってしまう問題でつまりました。
割としょうもない原因でしたが、同じエラーにあった人の参考になりましたら幸いです。

バージョン

Ruby 2.7.0
Rails 6.0.2.1
rspec-rails 3.9.0
rspec-support 3.9.2

発生したエラー

テスト用ヘルパーに定義したはずのメソッドが読み込まれてないのか、
テストを走らせると下記のようなエラーが発生。
log_in_asメソッドが定義されていないとの指摘。

Failures:

  1) ○○のテスト
     Failure/Error: log_in_as(user)

     NoMethodError:
       undefined method `log_in_as' for # (略)

ちなみにテスト用ヘルパー(spec/supports/test_helper.rb)には、
下記のようにlog_in_asメソッドを定義している。

test_helper.rb
def log_in_as(user)
    visit login_path
    fill_in 'メールアドレス', with: user.email
    fill_in 'パスワード', with: user.password
    click_button 'ログイン'
end

ヘルパー読み込みの手順の確認

読み込まれていない理由を探るために、どのような手順でヘルパーが読み込まれていくのか確認した。

まず、テストコードを記載するファイル(spec/system/users_spec.rb)には
下記のように記載があり、rails_helper.rbを読み込んでいる。

users_spec.rb
require 'rails_helper'

RSpec.describe  ・・・()

そのrails_helper.rbでは、下記行にてテスト用ヘルパーを読み込んでいる。

rails_helper.rb
Dir[Rails.root.join('spec', 'support', '**', '*.rb')].each { |f| require f }

spec/support配下で.rbのつくファイルを全てrequireすることにより読み込んでいる。
log_in_asメソッドを定義したtest_helper.rbは、spec/supportsの中。
supportsupportsで違う。。。

解決

supportsupportsに変えたら無事メソッドを読み込んでくれました。

rails_helper.rb
Dir[Rails.root.join('spec', 'supports', '**', '*.rb')].each { |f| require f }

この行をコメントインはしたような気がしますが、sを消した覚えはないです。
おそらくCapybaraを導入したときに参考にしていたサイトがsupportsをディレクトリ名としていたので、
同じようにやってしまっていたと思われます。

ちなみに、下記のようにヘルパーファイルを直接指定するやり方でも問題なく読み込みました。

rails_helper.rb
require 'supports/test_helper.rb'

まとめ

なんともしょうもない原因でしたが、ヘルパー読み込みの仕組みを学習する良い機会になったとポジティブにとらえます。

5
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
5
1