前提
ruby(rails)でgoogleMapAPIを用いたWebアプリを作成していました。
googleMapAPIで地名をフォームに補完してくれる機能を投稿画面に実装した所、以下のように地名の候補をエンターキー押下で洗濯するとフォームのサブミットが走ってしまうという事象が発生しました。
調査した所、フォームのサブミットのコードにonclick属性の追加とtypeをbuttonに変更することで事象を回避することができました
html
1 <%= form_with(model: post, local: true) do |f| %> 2 ~中略~ 3 <div class='form-submit'> 4 <% if post.persisted? %> 5 <%= f.submit "更新する", class:'btn btn-success btn-lg', onclick:"submit();", type:'button' %> 6 <%else%> 7 <%= f.submit "登録する", class:'btn btn-success btn-lg', onclick:"submit();, type:'button'"%> 8 <% end %> 9 </div> 10 <% end %>
実現したいこと
以上の前提を踏まえてフィーチャースペックをrspecおよびcapybaraを利用してコーディングしていたのですが、上記のtype:'button'の記述が存在すると、フィーチャースペック上でclick_onでサブミットボタンを指定しても投稿画面からどこにも遷移しないという事象が発生しました。
テスト時のみtype:'button'の記述を削除すれば正常にフィーチャースペックは通るのですが、できればそのような手間を省きたいです。
前提のエラーを回避しつつ、フィーチャースペックを通す修正案をご教授ください。
発生している問題・エラーメッセージ
フォームのサブミットにtype:'button'がある場合
❯ bundle exec rspec spec/features/post_spec.rb post 正常系 ログイン状態の場合 マイページから新規投稿画面に遷移で投稿 (FAILED - 1) Failures: 1) post 正常系 ログイン状態の場合 マイページから新規投稿画面に遷移で投稿 Failure/Error: expect(current_path).to eq post_path(Post.last) expected: "/posts/21" got: "/posts/new" (compared using ==) # ./spec/features/post_spec.rb:40:in `block (5 levels) in <top (required)>' # ./spec/features/post_spec.rb:29:in `block (4 levels) in <top (required)>' Finished in 1.27 seconds (files took 2.01 seconds to load) 1 example, 1 failure Failed examples: rspec ./spec/features/post_spec.rb:28 # post 正常系 ログイン状態の場合 マイページから新規投稿画面に遷移で投稿
フォームのサブミットにtype:'button'が無い場合
❯ bundle exec rspec spec/features/post_spec.rb post 正常系 ログイン状態の場合 マイページから新規投稿画面に遷移で投稿 Finished in 1.63 seconds (files took 2.83 seconds to load) 1 example, 0 failures
該当のソースコード
ruby
1# フィーチャースペック 2require 'rails_helper' 3require 'spec_helper' 4 5feature 'post' do 6 given!(:user) { create(:user) } 7 given!(:post_public) { create(:post, user_id: user.id) } 8 9 context "正常系" do 10 〜中略〜 11 context "ログイン状態の場合" do 12 background do 13 login_as(user, :scope => :user) 14 visit user_path(user.id) 15 end 16 17 scenario "マイページから新規投稿画面に遷移で投稿" do 18 expect { 19 find('.user-contents').click_on '新規投稿' 20 expect(current_path).to eq new_post_path 21 22 ~中略(必須項目の記載)~ 23 24 click_on '登録する' 25 26 expect(current_path).to eq post_path(Post.last) 27 expect(page).to have_content '投稿しました' 28 }.to change(user.posts, :count).by(1) 29 end 30 end 31 end 32 end
ruby
1 # コントローラ 2 def create 3 @post = Post.create(post_params) 4 if @post.save 5 redirect_to post_path(@post.id), notice: "投稿しました" 6 else 7 redirect_to new_post_path, alert: "投稿に失敗しました" 8 end 9 end
補足情報(FW/ツールのバージョンなど)
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin19]
Rails 5.2.4.2
rspec 3.9.0
capybara 3.32.1
あなたの回答
tips
プレビュー