システムスペックを書いている際にCapybaraのsend_keysメソッドを使おうとしたら、
NotImplementedError
が発生し、解決に時間がかかってしまったので、対処法を備忘録として記載します。
結論から言うと、RSpecでJavaScriptを使う設定をし忘れていたことが原因でした。
エラーの発生
下記のテスト実行時に、NotImplementedError
が発生しました。
Failures:
1) Messages can display messages in real time
Failure/Error: find('#message').send_keys(:enter)
NotImplementedError:
NotImplementedError
発生箇所はsend_keysメソッドのようです。
spec/systems/messages_spec.rb
require 'rails_helper'
RSpec.describe 'Messages', type: :system do
# 略
it 'can display messages in real time', js: true do
log_in(user)
visit room_path(room)
message = 'Hello'
expect{
fill_in 'Write a message', with: message
# send_keysメソッドでエラー発生
find('#message').send_keys(:enter)
}.to change(Message, :count).by(1)
expect(page).to have_content message
end
対処法
1 JSのドライバの設定を追加する
spec/support/capybara.rb
RSpec.configure do |config|
config.before(:each, type: :system) do
driven_by :rack_test
end
# 追記
config.before(:each, type: :system, js: true) do
driven_by :selenium_chrome_headless
end
end
2 スペックでJSを有効にする
spec/support/capybara.rb
require 'rails_helper'
RSpec.describe 'Messages', type: :system do
# 略
# js: true を追記
it 'can display messages in real time', js: true do
log_in(user)
visit room_path(room)
message = 'Hello'
expect{
fill_in 'Write a message', with: message
find('#message').send_keys(:enter)
}.to change(Message, :count).by(1)
expect(page).to have_content message
end