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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

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

RSpec

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

Ruby on Rails

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

Q&A

2回答

1033閲覧

[Ruby on Rails6.0]integration testにて、check_boxヘルパーでpostした配列をテストしたい。

gussan-me

総合スコア7

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails 6

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

RSpec

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

Ruby on Rails

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

0グッド

0クリップ

投稿2021/03/16 00:10

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

としておりました。

以上でございます。
恐れ入りますが、ご確認の程よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

TDDから見たら邪道ですが。。。
ブラウザーでその画面で北海道と青森県を選んでsubmitし、logでParamatersを確認してみてください。
そこをみれば どのように書けばよいか 判るでしょう

投稿2021/03/16 00:25

winterboum

総合スコア23347

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

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

gussan-me

2021/03/16 00:41

ご確認いただき、ありがとうございます。 logのParametersが下記となっていたため、 統合テストで prefecture = ["北海道", "青森県"]とday_of_activity = ["月", "火"]を定義してみました。 しかし、上記と同じエラーが出てしまいます。。 Started POST "/microposts" for 116.64.36.133 at 2021-03-16 00:30:41 +0000 Cannot render console from 116.64.36.133! Allowed networks: 127.0.0.0/127.255.255.255, ::1 Processing by MicropostsController#create as HTML Parameters: {"authenticity_token"=>"K95nKnd+BXdSTZv6b6k0HAlEYCvRLDaDzYuueocjzf/kerT8z3N+iOgp/QB2MA9lAzIGiFmbLMS3QE3unBVxKQ==", "micropost"=>{"content"=>"北海道青森県", "prefecture"=>["北海道", "青森県"], "day_of_activity"=>["月", "火"]}, "commit"=>"投稿する"} User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT ? [["id", 1], ["LIMIT", 1]] ↳ app/helpers/sessions_helper.rb:18:in `current_user' (0.1ms) begin transaction ↳ app/controllers/microposts_controller.rb:14:in `create' Micropost Create (8.2ms) INSERT INTO "microposts" ("content", "user_id", "created_at", "updated_at", "prefecture", "day_of_activity") VALUES (?, ?, ?, ?, ?, ?) [["content", "北海道青森県"], ["user_id", 1], ["created_at", "2021-03-16 00:30:41.156427"], ["updated_at", "2021-03-16 00:30:41.156427"], ["prefecture", "北海道,青森県"], ["day_of_activity", "月,火"]]
winterboum

2021/03/16 09:04

どう書きました?
gussan-me

2021/03/16 11:22 編集

test/integration/microposts_interface_test.rbの「#有効な送信」以下の箇所を下記の通り書き直しました。 content = "contentcontentcontentcontet" prefecture = ["北海道", "青森県"] day_of_activity = ["月", "火"] assert_difference 'Micropost.count', 1 do  post microposts_path, params: { micropost: { content: content, prefecture: prefecture, day_of_activity: day_of_activity } } end よろしくお願いいたします。
guest

0

テストコード内で配列が定義されていないから、

上記のエラーが出ているのかと考えたためです。

それなのにprefecture = "北海道,青森県"と文字列を渡しているのは何を意図したものなのでしょうか?

投稿2021/03/16 00:12

maisumakun

総合スコア145184

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

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

gussan-me

2021/03/16 00:45

失礼いたしました。 microposts_controller.rbの中で、下記のようにjoinメソッドを使用していたためです。 配列を「,」で区切って連結させたため、prefecture = "北海道,青森県"とさせていただきました。 def prefecture_string params[:micropost][:prefecture] = params[:micropost][:prefecture].join(",") end
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問