Lazuli

らずり

Rspec で uninitialized constant Capybara (NameError) エラー

最近、Ruby on Rail のチュートリアル をやってる。RubyRails 覚えたい。
順調に進んでたけど Rspec でテスト書くところで躓いた。

第3章 ほぼ静的なページの作成 | Rails チュートリアル

この章で Capybara DSLRspec に読み込ませる箇所がある。

# spec_helper.rb
Config.include Capybara::DSL

これを書いて実行すると

$ bundle exec rspec spec/requests/static_pages_spec.rb
/path/to/rails_application/spec/spec_helper.rb:46:in `block in <top (required)>': uninitialized constant Capybara (NameError)

というようなエラーになってテストが走らない。
なんとなく Capybara というモジュール?が正しく認識出来てないからだと推測。


ぐぐってみると、そもそも Capybara が入ってるかと言われる。

# Gemfile
group :test do
  gem 'selenium-webdriver'
  gem 'capybara'
end

Gemfile は問題なさそう。

$ bundle list | ag capybara
* capybara (2.4.4)

インストールもちゃんとされてる。
さらにぐぐる


チュートリアルのバージョンと違うんじゃねと言われる。
どうやらチュートリアルが少し古くてこの書き方ではモジュールが読み込めていないらしい。
モジュールが読み込めるように下記の設定を記述したら動いた。

# spec_helper.rb
ENV['RAILS_ENV'] = 'test'
require File.expand_path('../../config/environment', __FILE__)


やってることは難しくなさそう。

ENV['RAILS_ENV'] = 'test'

はおそらく環境変数をテスト用にしてるんだろう。

require File.expand_path('../../config/environment', __FILE__)

File.expand_path は初めて見る関数なので調べた。
第一引数に与えた相対パス絶対パスに変えてくれるようだ。
第二引数にパスを指定した場合、そのパスをカレントディレクトリにして見た相対パスが指定出来る。
第二引数無しだと現在のカレントディレクトリを元に相対パスを指定する。
要するに config/environment.rb を読み込んで環境変数周りの初期化をしてるっぽい。
初期化すれば Capybara のモジュールが読み込めてテストが動くという感じ、かな。

RubyRails 結構楽しい。