前提・実現したいこと
capybaraで記事の新規投稿をする場合の統合テストを書いています。
新規投稿画面で、以下のように「犬種」を選択すると、その子カテゴリーのselectタグが出てくるようにJavaScript (jQuery) を書いています。
![]
この新しく生成されたselectタグを、capybara上で選択されるようにしたいのですが、以下のようなエラーが発生します。
発生している問題・エラーメッセージ
Failures: 1) post create post Failure/Error: select 'ゴールデンレトリバー', from: 'child_category' Capybara::ElementNotFound: Unable to find select box "child_category" that is not disabled and Unable to find input box with datalist completion "child_category" that is not disabled
該当のソースコード
spec/features/post_spec.rb
ruby
1require 'rails_helper' 2 3feature 'post', type: :feature do 4 let(:user) { create(:user) } 5 background do 6 parent_category = Category.create(name: '大型犬', ancestry: nil) 7 child_category = Category.create(name: 'ゴールデンレトリバー', ancestry: 9) 8 end 9 10 scenario 'create post', js: true do 11 visit root_path 12 expect(page).to have_no_content('新規投稿') 13 14 visit login_path 15 fill_in 'user_email', with: user.email 16 fill_in 'user_password', with: user.password 17 find('input[value="ログイン"]').click 18 expect(current_path).to eq root_path 19 expect(page).to have_content('新規投稿') 20 21 expect { 22 click_link('new-post-btn') 23 expect(current_path).to eq new_post_path 24 attach_file 'post_images_1', "#{Rails.root}/spec/support/assets/test-image.png", make_visible: true 25 fill_in 'post_title', with: 'フィーチャスペックのテスト' 26 fill_in 'post_body', with: 'フィーチャスペックのテスト' 27 select '大型犬', from: 'parent_category' 28 select 'ゴールデンレトリバー', from: 'child_category' ###ここでエラー発生### 29 find('input[value="保存"]').click 30 }.to change(Post, :count).by(1) 31 end 32end
rails_helper.rb
ruby
1require 'spec_helper' 2ENV['RAILS_ENV'] ||= 'test' 3require File.expand_path('../config/environment', __dir__) 4if Rails.env.production? 5 abort('The Rails environment is running in production mode!') 6end 7require 'rspec/rails' 8 9require 'capybara/rspec' 10require 'capybara/poltergeist' 11 12begin 13 ActiveRecord::Migration.maintain_test_schema! 14rescue ActiveRecord::PendingMigrationError => e 15 puts e.to_s.strip 16 exit 1 17end 18RSpec.configure do |config| 19 Dir[Rails.root.join('spec/support/**/*.rb')].sort.each { |f| require f } 20 config.include Devise::Test::ControllerHelpers, type: :controller 21 config.include ControllerMacros, type: :controller 22 config.include FactoryBot::Syntax::Methods 23 Capybara.javascript_driver = :poltergeist 24 Capybara.register_driver :poltergeist do |app| 25 Capybara::Poltergeist::Driver.new(app, {js_errors: false}) 26 end 27 28 Headless.new.start 29 30 require 'database_cleaner' 31 config.before(:suite) do 32 DatabaseCleaner.strategy = :truncation 33 DatabaseCleaner.clean_with(:truncation) 34 end 35 36 config.before(:each) do 37 DatabaseCleaner.start 38 end 39 40 config.after(:each) do 41 DatabaseCleaner.clean 42 end 43 44 config.fixture_path = "#{::Rails.root}/spec/fixtures" 45 config.use_transactional_fixtures = false 46 config.infer_spec_type_from_file_location! 47 config.filter_rails_from_backtrace! 48end 49 50FactoryBot::SyntaxRunner.class_eval do 51 include ActionDispatch::TestProcess 52end
posts_controller.rb
ruby
1 def new 2 @post = Post.new 3 @images_count = @post.images.length.to_i 4 5 @category_parent_array = ['---', '大型犬', '中型犬', '小型犬'] 6 end
new.html.haml
haml
1.form-group#category 2 = f.label :parent_category, '犬種:' 3 = f.select :parent_category, @category_parent_array, {}, { id: 'parent_category', class: 'form-control' }
javascriptで生成されるselectタグ
html
1<select id="child_category" class="form-control mt-2" name="post[child_category]"> 2 <option value="---">---</option> 3 <option value="ゴールデンレトリバー" data-category="10">ゴールデンレトリバー</option> 4 <option value="ラブラドールレトリバー" data-category="11">ラブラドルレトリバー</option> 5 ##(中略) 6</select>
post-categoies.js
js
1$(document).on('turbolinks:load', function(){ 2 $(function(){ 3 // カテゴリーセレクトボックスのオプションを作成 4 function appendOption(category){ 5 var html = `<option value="${category.name}" data-category="${category.id}">${category.name}</option>`; 6 return html; 7 } 8 // 子カテゴリーの表示作成 9 function appendChidrenBox(insertHTML){ 10 var childSelectHtml = ''; 11 childSelectHtml = ` 12 <select id="child_category" class="form-control mt-2" name="post[child_category]"> 13 <option value="---">---</option> 14 ${insertHTML} 15 </select>`; 16 $('#category').append(childSelectHtml); 17 } 18 // 親カテゴリー選択後のイベント 19 $('#parent_category').on('change', function(){ 20 var parentCategory = document.getElementById('parent_category').value; //選択された親カテゴリーの名前を取得 21 if (parentCategory != "---"){ //親カテゴリーが初期値でないことを確認 22 $.ajax({ 23 url: '/posts/set_category_children', 24 type: 'GET', 25 data: { parent_name: parentCategory }, 26 dataType: 'json' 27 }) 28 .done(function(children){ 29 $('#child_category').remove(); //親が変更された時、子以下を削除するする 30 var insertHTML = ''; 31 children.forEach(function(child){ 32 insertHTML += appendOption(child); 33 }); 34 appendChidrenBox(insertHTML); 35 }) 36 .fail(function(){ 37 alert('カテゴリー取得に失敗しました'); 38 }) 39 }else{ 40 $('#child_category').remove(); //親カテゴリーが初期値になった時、子以下を削除するする 41 } 42 }); 43 }); 44});
試したこと
以下の記事を参考にして、poltergeistをセットアップしているのですが、うまくいかず・・・
使えるRSpec入門・その4「どんなブラウザ操作も自由自在!逆引きCapybara大辞典」
また他にもcapybara-webkitを導入してみたりなどもしましたが、これもまたうまく動作しないという状態です。。
原因や解決方法がわかりそうな方がいらっしゃいましたら、ご助言いただけますと幸いです。????♂️
補足情報(FW/ツールのバージョンなど)
ruby 2.5.1
rails 5.2.3
あなたの回答
tips
プレビュー