はじめに
Rails+RSpec+Capybaraで書いたテストを実行しようとしたらタイトルのようなエラーが出た方に向けて解決法を残しておきます。
この記事が役に立つ方
- タイトルのようなエラーで困っている方
この記事のメリット
- エラー解決!
環境
- macOS Catalina 10.15.1
- zsh: 5.7.1
- Ruby: 2.6.5
- Rails: 5.2.3
- RSpec: 3.9.0
- Capybara: 3.29.0
エラー内容
NoMethodError:
undefined method `visit' for #<RSpec::ExampleGroups::UsersIndex::IndexHtmlErb:...>
なぜかvisit
が定義されていないことになっている。
原因
Capybara
が読み込まれていないことが原因です。
visit
はCapybara
内で定義されているため読み込む必要があります。
解決法 その1
以下を追記します。
...略
require 'capybara/rspec' # 追記
RSpec.configure do |config|
...略
解決法 その2(1で解決しなかった場合)
もういっちょ追記します。
...略
require 'capybara/rspec'
RSpec.configure do |config|
config.include Capybara::DSL # 追記
...略
なぜ解決したのか?
公式のREADMEに答えが書いています。(※以下はバージョン3.29対応版)
capybara/README.md at 3.29_stable · teamcapybara/capybara · GitHub
Load RSpec 3.5+ support by adding the following line (typically to your spec_helper.rb file):
RSpec3.5以上を使っているなら、spec_helper.rb
に以下を追記してねと書いてあります。
require 'capybara/rspec'
これでCapybara
が読み込まれることになります。
ここまでが解決策1の範囲です。
ただ、これで解決しない方はREADMEの次の文章に答えが書いてあります。
If you are using Rails, put your Capybara specs in spec/features or spec/system (only works if you have it configured in RSpec) and if you have your Capybara specs in a different directory, then tag the example groups with type: :feature or type: :system depending on which type of test you're writing.
書いたテストが以下ディレクトリにあるか、
spec/features
spec/system
タグが以下でないとCapybara
が読み込まれません。
type: :feature
type: :system
そのため、それ以外のパターンに該当してしまう場合は
解決法 その2
で追記したように強制的にCapybara::DSL
を読み込んでしまうことで解決出来ます。
おわりに
自分は結構ここでハマってしまったので、同じような方の役に立てればと思います。
日本語の記事で楽をせず、困ったら公式を見ないといけませんね
参考にさせて頂いたサイト(いつもありがとうございます)
capybara/README.md at 3.29_stable · teamcapybara/capybara · GitHub