質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Capybara

Capybaraは、 Rubyで開発されているWebアプリケーションテストフレームワークです。Webブラウザ不要でブラウザ上のユーザー操作及びJavaScriptの挙動を自動化することができます。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

ラジオボタン

ラジオボタンはフォームに使われる要素のひとつであり、ユーザに限られた選択肢からひとつの答えを選んでもらうというものです。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Q&A

解決済

1回答

1626閲覧

RSpec・結合テストでラジオボタンで選択した値が保存されない

programmingnuoh

総合スコア0

Capybara

Capybaraは、 Rubyで開発されているWebアプリケーションテストフレームワークです。Webブラウザ不要でブラウザ上のユーザー操作及びJavaScriptの挙動を自動化することができます。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

ラジオボタン

ラジオボタンはフォームに使われる要素のひとつであり、ユーザに限られた選択肢からひとつの答えを選んでもらうというものです。

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

0グッド

0クリップ

投稿2021/05/12 13:32

実現したいこと

結合テストでラジオボタンで選択したい値を保存したい

質問内容

個人で投稿サイトを作成しております。
投稿機能の結合テストで新規投稿をしようとするとラジオボタンで選択した値が保存できないというエラーが発生しています。

お手数ですがコード内容の指摘、参考になる記事の共有などしていただけますと幸いです。

###コード記述内容
エラー内容
結合テスト結果
(投稿が成功していればroot_pathに遷移するはずだが、新規投稿ページに戻っている)

1) Delis 投稿ができる時 ログインしたユーザーは新規投稿ができる Failure/Error: expect(current_path).to eq(root_path) expected: "/" got: "/delis" (compared using ==)

binding.pryで得たエラー内容

Delis 投稿ができる時 From: /Users/user/projects/delishare/app/controllers/delis_controller.rb:16 DelisController#create: 14: def create 15: @deli = Deli.new(deli_params) => 16: binding.pry 17: if @deli.save 18: redirect_to root_path 19: else 20: render :new 21: end 22: end [1] pry(#<DelisController>)> @deli.valid? => false [2] pry(#<DelisController>)> @deli.errors.full_messages => ["Category must exist"] [3] pry(#<DelisController>)> @deli.category_id => 1

delis_spec.rb(結合テスト記述ファイル)

ruby

1require 'rails_helper' 2 3RSpec.describe 'Delis', type: :system do 4 before do 5 @user = FactoryBot.create(:user) 6 end 7 8 context '投稿ができる時' do 9 it 'ログインしたユーザーは新規投稿ができる' do 10 visit new_user_session_path 11 fill_in 'user[email]', with: @user.email 12 fill_in 'user[password]', with: @user.password 13 find('input[name="commit"]').click 14 expect(current_path).to eq(root_path) 15 expect(page).to have_content('New Deli') 16 visit new_deli_path 17 expect(current_path).to eq(new_deli_path) 18 fill_in 'deli[name]', with: 'test' 19 fill_in 'deli[text]', with: 'test' 20 choose ('deli_category_id_1') 21 select 'ヤオコー', from: 'deli[supermarket_id]' 22 image_path = Rails.root.join('public/images/testimage.jpg') 23 attach_file('deli[image]', image_path, make_visible: true) 24 find('input[name="commit"]').click 25 expect(current_path).to eq(root_path) 26 expect(page).to have_content(@deli.name) 27 end 28 end 29end

delis_controller.rb(コントローラー)

ruby

1class DelisController < ApplicationController 2 before_action :authenticate_user!, except: [:index, :show] 3〜中略〜 4 5 def new 6 @deli = Deli.new 7 end 8 9 def create 10 @deli = Deli.new(deli_params) 11 if @deli.save 12 redirect_to root_path 13 else 14 render :new 15 end 16 end 17 18〜中略〜 19 20 private 21 22 def deli_params 23 params.require(:deli).permit(:name, :text, :category_id, :supermarket_id, :image).merge(user_id: current_user.id) 24 end 25 26〜中略〜 27end 28

モデル

class Deli < ApplicationRecord with_options presence: true do validates :name validates :text validates :supermarket_id validates :image end belongs_to :user belongs_to :category has_one_attached :image extend ActiveHash::Associations::ActiveRecordExtensions belongs_to_active_hash :supermarket end

ビューファイル

ruby

1<div class="deli-new-form"> 2<%= form_with model: @deli, local: true do |f|%> 3 <div class="field"> 4 <div class="post-label"> 5 <%= f.label :name, "お惣菜名" %> 6 </div> 7 <%= f.text_field :name, class:"deli-form" %> 8 </div> 9 10 <div class="field"> 11 <div class="post-label"> 12 <%= f.label :text, "説明" %> 13 </div> 14 <%= f.text_area :text, class:"deli-form" %> 15 </div> 16 17 <div class="field"> 18 <div class="post-label"> 19 <%= f.label :category_id, "カテゴリ" %> 20 </div> 21 <div class="categories-radio"> 22 <div class="category-radio"> 23 <%= f.radio_button :category_id, '1' %> 24 <%= f.label :category_id, '惣菜紹介', value: 1 %> 25 </div> 26 <div class="category-radio"> 27 <%= f.radio_button :category_id, '2' %> 28 <%= f.label :category_id, 'アレンジレシピ', value: 2 %> 29 </div> 30 </div> 31 </div> 32 33 <div class="field"> 34 <div class="post-label"> 35 <%= f.label :supermarket_id, "購入した店舗" %> 36 </div> 37 <%= f.collection_select(:supermarket_id, Supermarket.all, :id, :name, {prompt:'--------'},{class:"select-box", id:"deli-supermarket"}) %> 38 </div> 39 40 <div class="field"> 41 <div class="post-label"> 42 <%= f.label :image, "画像" %> 43 </div> 44 <%= f.file_field :image %> 45 </div> 46 47 <div class="actions"> 48 <%= f.submit "投稿する", class:"form__btn" %> 49 </div> 50<% end %> 51</div>

試したこと

  • findメソッドの使用
  • CategoryをFactoryBotで生成したものを使って値代入

参考記事

https://gist.github.com/zhengjia/428105
https://easyramble.com/form-tests-with-capybara.html
https://www.ruby-forum.com/t/capybara-radio-buttons/200578

補足

ruby 2.6.5
rails 6.0.3.6

何卒よろしくおねがいいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

テスト環境にCategoryテーブルの値が保存されていなかったことが原因でした。
develop環境にはseedで値を保存していたため、rake DB:seed RAILS_ENV=testを実行してテスト環境にも同じ値を保存しました。

投稿2021/05/16 06:23

programmingnuoh

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問