RSpec x Capybara で JS が絡んだテストする際に,バージョンやドライバによって使える使えないメソッドがある.
https://github.com/thoughtbot/capybara-webkit/issues/84#issuecomment-111632554
https://stackoverflow.com/a/44401757/4535592
やりたいこと
あるモデルの削除ボタンをクリックすると,confirmダイアログが表示され,それを accept すると削除が完了するケースをテストしたい.
Viewの記述はざっくり下記の通り.
views/hoges/edit.html.slim
= link_to @hoge, data: {confirm: 'Are you sure you want to delete?'}, method: :delete, id: 'delete-hoge' do
| 削除
記述方法
やはりバージョンによって記述がまちまちのようだが,2017.08 にリリースされた現時点での最新版 2.15.1 だと,下記で問題なく動作した.
- capybara 2.15.1
- capybabra-webbkit 1.1.0
Gemfile
group :test do
gem 'rspec-rails'
gem 'capybara', '~>2.15.1'
gem 'capybara-webkit', '~>1.1.0'
end
Gemfile.lock
capybara (2.15.1)
addressable
mini_mime (>= 0.1.3)
nokogiri (>= 1.3.3)
rack (>= 1.0.0)
rack-test (>= 0.5.4)
xpath (~> 2.0)
capybara-webkit (1.1.0)
capybara (~> 2.0, >= 2.0.2)
json
spec_helper.rb
require 'capybara/rspec'
Capybara.javascript_driver = :webkit
accept は page.driver.browser.accept_js_confirms
を使う.
page.driver.browser.switch_to.alert.accept
や page.accept_confirm { click_link "XXX" }
は, undefined method
エラーになり動作しなかった.
hoge_spec.rb
feature 'hoge', js: true do # ← js:true は必須
scenario 'hogehoge' do
hoge = FactoryGirl.create(:hoge)
visit edit_hoge_path(hoge)
expect(page).to have_content 'edit hoge'
click_link 'delete-hoge'
page.driver.browser.accept_js_confirms
expect(page).to have_content 'Completed'
end
end