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

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

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

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

Ruby on Rails 6

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

RSpec

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

Q&A

1回答

995閲覧

コントローラーの単体テストコードについて(FactoryBotで作成した投稿内容が反映されない)

yasukuro

総合スコア2

Ruby

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

Ruby on Rails 6

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

RSpec

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

0グッド

1クリップ

投稿2020/11/18 08:35

前提・実現したいこと

Rails 6.0 にてコントローラーの単体テストコードを作成しております。
FactoryBotで作成したユーザーでログイン後、FactoryBotで作成した投稿内容(content)がviewファイルに反映されずテストコードがエラーとなります。
コントローラーテストでの処理は下記の流れであると考えているので、なぜうまくいかないのかわからない状態です。
FactoryBotで作成したuserでサインイン
=> FactoryBotにてcontentを作成
=> viewファイルに作成したcontent内容が保存される
=> viewファイルの中に「group.content」が存在する。

ご教示いただければ幸いです。
どうぞよろしくお願いいたします。

発生している問題・エラーメッセージ

FacrtoryBotにてgroupモデルにてcontentを作成しているが、viewファイルに反映されない。

groups_controller GET #index indexアクションにリクエストすると正常にレスポンスが返ってくる indexアクションにリクエストすると投稿済みのリストが存在する (FAILED - 1) Failures: 1) groups_controller GET #index indexアクションにリクエストすると投稿済みのリストが存在する Failure/Error: expect(response.body).to include @group.content expected "<!DOCTYPE html>\n<html>\n <head>\n <title>ShareHousework</title>\n \n \n <link rel=\"st...\"groups\">\n </div>\n </div>\n <div class=\"chat\">\n </div>\n</div>\n\n </body>\n</html>\n" to include "tnqawdzmpg" Diff: @@ -1,41 +1,81 @@ -tnqawdzmpg +<!DOCTYPE html> +<html> + <head> + <title>ShareHousework</title> + + + <link rel="stylesheet" type="text/css" href="http://yui.yahooapis.com/3.18.1/build/cssreset/cssreset-min.css"> + + <link rel="stylesheet" media="all" href="/assets/application-9cea07b4f8af4df67abda21eed7ef1011f4c3480fea2f5a25f2bef2e3b036b02.css" data-turbolinks-track="reload" /> + + <script src="/packs-test/js/application-5ae5220edf58691213dc.js" data-turbolinks-track="reload"></script> + </head> + + <body> + <div class="wrapper"> + <div class="side-bar"> + <div class="side-bar-header"> + <div class="header-name"> + Walter + <a class="logout" rel="nofollow" data-method="delete" href="/users/sign_out">ログアウト</a> + </div> + <div class="create-group"> + <div class="make-list"> + <div class="header-button"> + <form action="/groups" accept-charset="UTF-8" method="post"> + <input class="group-text" placeholder="リストを入力(10文字以内)" type="text" name="group[content]" id="group_content" /> + </div> + <input type="submit" name="commit" value="作成" class="submit-btn" data-disable-with="作成" /> +</form> </div> + </div> + </div> + + <div class="groups"> + </div> + </div> + <div class="chat"> + </div> +</div> + + </body> +</html> # ./spec/requests/groups_spec.rb:17:in `block (3 levels) in <top (required)>' Finished in 1.43 seconds (files took 1.49 seconds to load) 2 examples, 1 failure Failed examples: rspec ./spec/requests/groups_spec.rb:14 # groups_controller GET #index indexアクションにリクエストすると投稿済みのリストが存在する

該当のソースコード

controllers/groups_controller

ruby

1class GroupsController < ApplicationController 2 def index 3 @group = Group.new 4 @groups = Group.includes(:user) 5 end 6 7 def create 8 @group = Group.new(group_params) 9 if @group.save 10 redirect_to groups_path 11 else 12 render :index 13 end 14 end 15 16 def edit 17 @group = Group.find(params[:id]) 18 end 19 20 def update 21 @group = Group.find(params[:id]) 22 if @group.update(group_params) 23 redirect_to groups_path 24 else 25 render :edit 26 end 27 end 28 29 def destroy 30 @groups = Group.includes(:user) 31 @group = Group.find(params[:id]) 32 redirect_to root_path if @group.destroy 33 end 34 35 private 36 37 def group_params 38 params.require(:group).permit(:content).merge(user_id: current_user.id) 39 end 40end 41

spec/Factories/users.rb

ruby

1FactoryBot.define do 2 factory :user do 3 name {Faker::Name.last_name} 4 email {Faker::Internet.free_email} 5 password {Faker::Internet.password(min_length: 8)} 6 password_confirmation {password} 7 end 8end

spec/Factories/groups.rb

ruby

1FactoryBot.define do 2 factory :group do 3 content { Faker::Alphanumeric.alphanumeric(number: 10) } 4 association :user 5 end 6end

spec/requests/groups_spec.rb

ruby

1require 'rails_helper' 2 3RSpec.describe "groups_controller", type: :request do 4 before do 5 user = FactoryBot.build(:user) 6 sign_in user 7 end 8 9 describe "GET #index" do 10 it "indexアクションにリクエストすると投稿済みのリストが存在する" do 11 get root_path 12 group = FactoryBot.create(:group) 13 expect(response.body).to include group.content 14 end 15 end 16end

app/view/groups/index.html

ruby

1<div class="side-bar-header"> 2 <div class="header-name"> 3 <%= current_user.name %> 4 <%= link_to "ログアウト", destroy_user_session_path, method: :delete, class: "logout"%> 5 </div> 6 <div class="create-group"> 7 <div class="make-list"> 8 <div class="header-button"> 9 <%= form_with model: @group, url: groups_path, local: true do |f| %> 10 <%= f.text_field :content, class: "group-text", placeholder: 'リストを入力(10文字以内)' %> 11 </div> 12 <%= f.submit "作成", class: "submit-btn"%> 13 <% end %> 14 </div> 15 </div> 16 </div> 17 18 <div class="groups"> 19 <% current_user.groups.each do |group| %> 20 <div class="group"> 21 <div class="group-name"> 22 <%= link_to group.content, group_tasks_path(group), data: {"turbolinks" => false}, class: "group-btn" %> 23 <div class="link_btns"> 24 <%= link_to "編集", edit_group_path(group), class: "group-delete-btn"%> 25 <%= link_to "削除", group_path(group), method: :delete ,class: "group-delete-btn"%> 26 </div> 27 </div> 28 </div> 29 <% end %> 30 </div> 31 </div>

試したこと

group = FactoryBot(:group)をbeforeアクションの中に入れましたがうまくいきませんでした。

補足情報(FW/ツールのバージョンなど)

Ruby 2.6.5
Ruby on Rails 6.0.0

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

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

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

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

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

guest

回答1

0

get root_path で app/view/groups/index.html を表示した後に
group = FactoryBot.create(:group) でデータを作成しているため
view側にデータが表示されません。処理の順序を下記の通りに変更してみましょう。

ruby

1spec/requests/groups_spec.rb 2 it "indexアクションにリクエストすると投稿済みのリストが存在する" do 3 group = FactoryBot.create(:group) 4 get root_path 5 expect(response.body).to include group.content 6 end

投稿2020/11/18 11:31

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

yasukuro

2020/11/18 13:25

Ryo.gift様 回答いただきありがとうございます。 アドバイス通り順序を変えてみましたが、問題は解決されませんでした。 自分でももう少し考えてみます! ご検討ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問