Railsにて、check_boxでチェックした複数の文字列をデータベースに保存するという機能を実装しました。
そこで、テストコードを書いているのですが、エラーが無くならず、困っております。
テストを自分で書くのは初めてのため、質問に必要な情報が足りているかも自身がない状況です。
足りない箇所がございましたら、ご指摘頂けますと幸いです。
#困っていること
下記のエラーを修正できない。
#コンソール上のエラー Error: WantedMembersTest#test_micropost_display: NoMethodError: undefined method `join' for "":String app/controllers/microposts_controller.rb:43:in `prefecture_string' test/integration/microposts_interface_test.rb:17:in `block (2 levels) in <class:WantedMembersTest>' test/integration/microposts_interface_test.rb:16:in `block in <class:WantedMembersTest>' rails test test/integration/microposts_interface_test.rb:10
上記でエラーがあるとされている箇所は下記です。
# app/controllers/micropost_controller.rb class MicropostsController < ApplicationController before_action :logged_in_user, only: [:create, :destroy] before_action :correct_user, only: [:destroy] before_action :prefecture_string, only: [:create] before_action :day_of_activity_string, only: [:create] def create @micropost = current_user.microposts.build(micropost_params) if @micropost.save flash[:success] = "投稿が完了しました!" redirect_to microposts_url else @microposts = current_user.feed.paginate(page: params[:page]) render 'microposts/index' end end private def micropost_params params.require(:micropost).permit(:content, :prefecture, :day_of_activity) end # beforeアクション def correct_user @micropost = current_user.microposts.find_by(id: params[:id]) redirect_to root_url if @micropost.nil? end # 配列を文字列にする #43行目 def prefecture_string params[:micropost][:prefecture] = params[:micropost][:prefecture].join(",") end def day_of_activity_string params[:micropost][:day_of_activity] = params[:micropost][:day_of_activity].join(",") end end
# test/integration/microposts_interface_test.rb require 'test_helper' class WantedMembersTest < ActionDispatch::IntegrationTest def setup @user = users(:michael) @non_admin = users(:archer) end test "micropost display" do log_in_as(@user) get microposts_path assert_template 'microposts/index' assert_select 'div.pagination', count: 1 # 無効な送信 assert_no_difference 'Micropost.count' do post microposts_path, params: { micropost: { content: "", prefecture: "", day_of_activity: "" } } end assert_select 'div#error_explanation' assert_select 'a[href=?]', '/microposts?page=2' # 有効な送信 content = "contentcontentcontentcontet" prefecture = "北海道,青森県" day_of_activity = "月,火" #エラー箇所(16~17行目) assert_difference 'Micropost.count', 1 do post microposts_path, params: { micropost: { content: content, prefecture: prefecture, day_of_activity: day_of_activity } } #←17行目 end assert_redirected_to microposts_url follow_redirect! assert_match content, response.body # 投稿を削除する assert_select 'a', text: '削除する' first_micropost = @user.microposts.paginate(page: 1).first assert_difference 'Micropost.count', -1 do delete micropost_path(first_micropost) end # 違うユーザーのプロフィールにアクセス(削除リンクがないことを確認) get user_path(users(:archer)) assert_select 'a', text: '削除する', count: 0 end end
#試したこと
上記に記載の通り、micropost_interface_test.rb
に,
prefecture = "北海道,青森県"
とday_of_activity = "月,火"
を追記してみましたが、エラーが治りませんでした。
こちらのコードを追記した理由としましては、テストコード内で配列が定義されていないから、
上記のエラーが出ているのかと考えたためです。
ちなみに最初は,エラーが出ている箇所は、
assert_difference 'Micropost.count', 1 do post microposts_path, params: { micropost: { content: content } } end
としておりました。
以上でございます。
恐れ入りますが、ご確認の程よろしくお願いいたします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/03/16 00:41
2021/03/16 09:04
2021/03/16 11:22 編集