前提・実現したいこと
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
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/11/18 13:25