#はじめに
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
メソッドを定義している。
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
を読み込んでいる。
require 'rails_helper'
RSpec.describe ・・・(略)
その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
の中。
support
とsupports
で違う。。。
#解決
support
をsupports
に変えたら無事メソッドを読み込んでくれました。
Dir[Rails.root.join('spec', 'supports', '**', '*.rb')].each { |f| require f }
この行をコメントインはしたような気がしますが、s
を消した覚えはないです。
おそらくCapybaraを導入したときに参考にしていたサイトがsupports
をディレクトリ名としていたので、
同じようにやってしまっていたと思われます。
ちなみに、下記のようにヘルパーファイルを直接指定するやり方でも問題なく読み込みました。
require 'supports/test_helper.rb'
#まとめ
なんともしょうもない原因でしたが、ヘルパー読み込みの仕組みを学習する良い機会になったとポジティブにとらえます。