

現在spec/system配下でテストを下記のように作成しているのですが、通りません。  
Rspecのconfirmについての最新記事が下記の記事ぐらいしかなく、  
解決方法が分かりません。ご教授頂ければ幸いです。

こちらの記事を参考に実装しております。  
[【Rails】Selenium/RSpecでconfirmダイアログのテストをする -
Qiita](https://qiita.com/at-946/items/403d85d45cb02615c323)

下記エラーが表示されます。

[code]

    Capybara::NotSupportedByDriverError: Capybara::Driver::Base#dismiss_modal
    Capybara::NotSupportedByDriverError: Capybara::Driver::Base#accept_modal
    
[/code]

**データ削除の時に書いているコード**

[code]

    <%= link_to "写真削除", post, method: :delete, id: 'delete_button', data: { confirm: "削除しますか?" } %>
    
[/code]

**spec/system/aaa_spec.rb**

[code]

    require 'rails_helper'
    
    RSpec.describe "AAA", type: :system, js: true do
      let(:user) { FactoryBot.create(:user) }
      let(:other_user) { FactoryBot.create(:user) }
      let(:img_path) { Rails.root.join("spec/img/aaa.jpg") }
    
      context "when a user posts a img" do
        it "test1" do
          visit new_user_session_path
          fill_in "メールアドレス", with: user.email
          fill_in "パスワード", with: user.password
          find('.signin-btn').click_link_or_button "ログイン"
          expect(page).to have_current_path root_path
    
          expect {
            upload_img(img_path)
          }.to change { user.posts.count }.by(1)
    
          expect(page).to have_current_path user_path(user)
          expect(page).to have_text "写真数(1)"
          expect(page).to have_selector '#post-1'
          expect(page).to have_selector '#favorite-form-1'
    
          click_button "お気に入り登録"
          expect(user.favorites.count).to eq 1
    
          visit users_path
          expect(page).to have_selector '#post-1'
          expect(page).not_to have_selector '#favorite-form-1'
    
          visit user_path(user)
          expect(page).to have_selector '#favorite-form-1'
          click_button "お気に入り取り消し"
          expect(user.favorites.count).to eq 0
    
          visit root_path
          find('#post-1').find('img').click
          expect(page).to have_selector '#showImgModal-1'
          expect(page).to have_selector '.post-delete', text: '写真削除'
    
          expect(page).to have_selector '#comment-form-1'
          within('#comment-form-1') do
            fill_in "コメント欄", with: "こんにちは"
            click_link_or_button "コメントする"
          end
          expect(user.comments.count).to eq 1
          expect(page).to have_selector '.comment', text: "コメント削除"
    
          page.dismiss_confirm("削除しますか?") do
            click_on :delete_button
          end
          page.accept_confirm do
            click_on :delete_button
          end
        end
      end
    end
    
    
[/code]

問題のコードの部分を下記に変更したらテストが全て通るようになった。  
こちら本当に合っているのでしょうか？

[code]

    page.dismiss_confirm("削除しますか?") do
      click_on :delete_button
    end
    page.accept_confirm do
      click_on :delete_button
    end
    ↓↓
    click_link "写真削除"
    expect(page).to have_content "写真が削除されました"
    
[/code]

**support/capybara.rb**

[code]

    RSpec.configure do |config|
      config.before(:each, type: :system) do
        driven_by :rack_test
      end
    end
    Capybara.javascript_driver = :selenium_chrome_headless
    
[/code]


CC BY-SA 4.0
2020-05-06T05:07:15.213
66340
2023-06-24T06:08:51.103
2021-07-20T02:10:53.240
3060
39925
question
ruby-on-rails ruby rspec capybara
Rspecでconfirmダイアログのテストが通らない


<https://github.com/teamcapybara/capybara#racktest>  
公式ドキュメントによると、`Rack::Test`はJavaScriptをサポートしていません。よって、モーダルなどは動作しないことになります。

`support/capybara.rb`の内容を

[code]

    RSpec.configure do |config|
      config.before(:each, type: :system) do
        driven_by :selenium_chrome_headless
      end
    end
    Capybara.default_driver = :rack_test
    Capybara.javascript_driver = :selenium_chrome_headless
    
[/code]

のようにしてみてはどうでしょう。この設定では、普段は高速な`rack_test`ドライバを使いつつ、JavaScriptの実行が必要な可能性のあるSystem
Specsに対しては`selenium_chrome_headless`ドライバを使うことでJavaScriptのテストも可能にしています。

* * *

余談ながら、該当するエラーは  
<https://github.com/teamcapybara/capybara/blob/2ffbb3c6a55b9b3de13819b171c331ef9d125d4e/lib/capybara/driver/base.rb#L120-L145>  
で起きているようです。


CC BY-SA 4.0
2020-05-06T16:40:58.237
66356
2020-05-06T16:40:58.237
442
66340
answer