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

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

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

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

Ruby on Rails

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

Q&A

解決済

2回答

895閲覧

rspecで予約登録のテストを通過させたいです。

Shuno

総合スコア5

RSpec

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

Ruby on Rails

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

0グッド

0クリップ

投稿2021/07/22 22:55

編集2021/07/24 02:05

前提・実現したいこと

ブラウザではきちんと登録処理できるのですが、rspecを通過できず詰まっております。
どなたがご教授お願いたします。

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

require 'rails_helper' RSpec.describe "ビデオ通話予約機能", type: :request do let(:user) { create(:user) } let(:other_user) { create(:user) } context "予約登録処理" do it "予約登録は実行できること" do login_for_request(user) get reservations_path(user_id: other_user.id, from_user_id: user.id) get new_reservation_path(user_id: other_user.id), params: { day: "2021-07-25", time: "10:00", user_id: other_user.id } expect { post "/reservations", params: { reservation: { day: "2021-07-25", time: "10:00", start_time: "2021-07-25T10:00:00+09:00", user_id: other_user.id } } }.to change(Reservation, :count).by(1) follow_redirect! expect(response).to render_template('reservations/show') end end end Failures: 1) ビデオ通話予約機能 予約登録処理 予約登録は実行できること Failure/Error: <%= f.hidden_field :user_id, value: @user.id %> ActionView::Template::Error: undefined method `id' for nil:NilClass # ./app/views/reservations/new.html.erb:20:in `block in _app_views_reservations_new_html_erb___1207770112998073758_70130725436680' # ./app/views/reservations/new.html.erb:9:in `_app_views_reservations_new_html_erb___1207770112998073758_70130725436680' # ./app/controllers/reservations_controller.rb:27:in `create' # ./spec/requests/reservations_spec.rb:35:in `block (4 levels) in <main>' # ./spec/requests/reservations_spec.rb:34:in `block (3 levels) in <main>' # -e:1:in `<main>' # ------------------ # --- Caused by: --- # NoMethodError: # undefined method `id' for nil:NilClass # ./app/views/reservations/new.html.erb:20:in `block in _app_views_reservations_new_html_erb___1207770112998073758_70130725436680'

該当のソースコード

app/controllers/reservations_controller.rb

class ReservationsController < ApplicationController before_action :logged_in_user def index @user = User.find(params[:user_id]) @reservations = Reservation.where("day >= ?", Date.current).where("day < ?", Date.current >> 3).order(day: :desc).where("user_id = ? or from_user_id = ?", @user.id, current_user.id) end def new @user = User.find(params[:user_id]) @reservation = Reservation.new @day = params[:day] @time = params[:time] @start_time = DateTime.parse(@day + " " + @time + " " + "JST") end def show @reservation = Reservation.find(params[:id]) end def create @reservation = Reservation.new(reservation_params) if @reservation.save flash[:success] = "ビデオ通話予約しました" redirect_to reservation_path @reservation.id else render :new end end def destroy @reservation = Reservation.find(params[:id]) if @reservation.destroy flash[:success] = "予約を削除しました。" redirect_to user_path(current_user.id) else render :reserve end end private def reservation_params params.require(:reservation).permit(:day, :time, :user_id, :from_user_id, :start_time) end end

app/views/reservations/new.html.erb

<% provide(:title, "新規予約画面") %> <section id="contact" class="contact section-bg login"> <div class="container"> <div class="col-12 text-center title"> <h2>新規予約画面</h2> </div> <div class="row justify-content-md-center"> <div class="col-md-5 col-md-offset-3"> <%= form_with model: @reservation, local: true, class: 'form' do |f| %> <%= render 'shared/error_messages', object: f.object %> <div class="day form-group"> <%= f.label :day, '日付' %> <%= f.text_field :day, class: 'form-control', value: @day, readonly: true %> </div> <div class="time form-group"> <%= f.label :time, '時間' %> <%= f.text_field :time, class: 'form-control', value: @time, readonly: true %> </div> <%= f.hidden_field :from_user_id, value: current_user.id %> <%= f.hidden_field :user_id, value: @user.id %> <%= f.hidden_field :start_time, value: @start_time %> <div class="submit"> <%= f.submit nil, class: 'btn btn-primary' %> </div> <% end %> </div> </div> </div> </section>

サーバーログ

Started GET "/reservations?user_id=1" for ::1 at 2021-07-24 11:00:07 +0900 Processing by ReservationsController#index as HTML Parameters: {"user_id"=>"1"} User Load (0.9ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]] ↳ app/helpers/sessions_helper.rb:43 User Load (0.8ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]] ↳ app/controllers/reservations_controller.rb:5 Rendering reservations/index.html.erb within layouts/application Reservation Load (53.0ms) SELECT "reservations".* FROM "reservations" WHERE (day >= '2021-07-24') AND (day < '2021-10-24') AND (user_id = 1 or from_user_id = 1) ORDER BY "reservations"."day" DESC ↳ app/views/reservations/index.html.erb:11 Reservation Load (0.8ms) SELECT "reservations".* FROM "reservations" WHERE (day >= '2021-07-24') AND (day < '2021-08-24') ORDER BY "reservations"."day" DESC ↳ app/models/reservation.rb:15 Rendered simple_calendar/_week_calendar.html.erb (15.1ms) Rendered reservations/index.html.erb within layouts/application (89.1ms) Rendered layouts/_rails_default.html.erb (24.8ms) Rendered layouts/_shim.html.erb (0.5ms) Rendered layouts/_navigation.html.erb (3.4ms) Rendered layouts/_search.html.erb (4.4ms) Rendered layouts/_footer.html.erb (0.5ms) Rendered layouts/_js.html.erb (16.7ms) Completed 200 OK in 188ms (Views: 107.2ms | ActiveRecord: 55.5ms) Started GET "/reservations/new?day=2021-07-25&time=10%3A00&user_id=1" for ::1 at 2021-07-24 11:00:08 +0900 Processing by ReservationsController#new as HTML Parameters: {"day"=>"2021-07-25", "time"=>"10:00", "user_id"=>"1"} User Load (3.9ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]] ↳ app/helpers/sessions_helper.rb:43 User Load (0.8ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]] ↳ app/controllers/reservations_controller.rb:10 Rendering reservations/new.html.erb within layouts/application Rendered shared/_error_messages.html.erb (0.9ms) Rendered reservations/new.html.erb within layouts/application (93.1ms) Rendered layouts/_rails_default.html.erb (21.5ms) Rendered layouts/_shim.html.erb (0.4ms) Rendered layouts/_navigation.html.erb (2.3ms) Rendered layouts/_search.html.erb (1.0ms) Rendered layouts/_footer.html.erb (0.3ms) Rendered layouts/_js.html.erb (7.1ms) Completed 200 OK in 147ms (Views: 135.9ms | ActiveRecord: 4.6ms) Started POST "/reservations" for ::1 at 2021-07-24 11:00:11 +0900 Processing by ReservationsController#create as HTML Parameters: {"utf8"=>"✓", "authenticity_token"=>"uzBu1Xyew30viLVC/AypLZ/h0zfOq9VxzEUyOloFyV8niK9bO8hOX6HmF6Y+UhAX/dul3TDfqlkpIgPgEkzxcA==", "reservation"=>{"day"=>"2021-07-25", "time"=>"10:00", "from_user_id"=>"1", "user_id"=>"1", "start_time"=>"2021-07-25T10:00:00+09:00"}, "commit"=>"登録する"} User Load (1.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]] ↳ app/helpers/sessions_helper.rb:43 (0.2ms) BEGIN ↳ app/controllers/reservations_controller.rb:23 CACHE User Load (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]] ↳ app/controllers/reservations_controller.rb:23 Reservation Exists (7.6ms) SELECT 1 AS one FROM "reservations" WHERE "reservations"."start_time" = $1 LIMIT $2 [["start_time", "2021-07-25 01:00:00"], ["LIMIT", 1]] ↳ app/controllers/reservations_controller.rb:23 Reservation Create (15.5ms) INSERT INTO "reservations" ("day", "time", "user_id", "created_at", "updated_at", "start_time", "from_user_id") VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING "id" [["day", "2021-07-25"], ["time", "10:00"], ["user_id", 1], ["created_at", "2021-07-24 02:00:11.467966"], ["updated_at", "2021-07-24 02:00:11.467966"], ["start_time", "2021-07-25 01:00:00"], ["from_user_id", 1]] ↳ app/controllers/reservations_controller.rb:23 (47.0ms) COMMIT ↳ app/controllers/reservations_controller.rb:23 Redirected to http://localhost:3000/reservations/20 Completed 302 Found in 125ms (ActiveRecord: 71.9ms) Started GET "/reservations/20" for ::1 at 2021-07-24 11:00:11 +0900 Processing by ReservationsController#show as HTML Parameters: {"id"=>"20"} User Load (0.6ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 LIMIT $2 [["id", 1], ["LIMIT", 1]] ↳ app/helpers/sessions_helper.rb:43 Reservation Load (0.5ms) SELECT "reservations".* FROM "reservations" WHERE "reservations"."id" = $1 LIMIT $2 [["id", 20], ["LIMIT", 1]] ↳ app/controllers/reservations_controller.rb:18 Rendering reservations/show.html.erb within layouts/application Rendered reservations/show.html.erb within layouts/application (1.1ms) Rendered layouts/_rails_default.html.erb (8.4ms) Rendered layouts/_shim.html.erb (0.3ms) Rendered layouts/_navigation.html.erb (3.1ms) Rendered layouts/_search.html.erb (1.8ms) Rendered layouts/_footer.html.erb (0.3ms) Rendered layouts/_js.html.erb (7.2ms) Completed 200 OK in 37ms (Views: 30.7ms | ActiveRecord: 1.2ms)

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

rubyのバージョンは2.6.7です。
必要な箇所があれば載せますのでよろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

model のcodeが載っていないのでエスパーモードですが
おそらく validation に掛かって create のsaveに失敗し、render :new に行ったのだが、この場合は @user 定義してないですね。
そのためのエラーです

投稿2021/07/24 02:32

winterboum

総合スコア23567

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

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

Shuno

2021/07/24 03:07

ご回答ありがとうございます。 rspecのコードで引っ掛かっていたのですね。
guest

0

エラーメッセージ通りHTMLの
<%= f.hidden_field :user_id, value: @user.id %>
@user がNilになっているのが原因ではないでしょうか?

投稿2021/07/23 08:09

odataiki

総合スコア973

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

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

Shuno

2021/07/24 02:06

ご回答ありがとうございます。 また言葉が足らず申し訳ございません。 @user が nil だとわかるのですが、ブラウザは正常に作動しているので rspecを修正しなければならないと思うのですが、どうすればよいでしょうか。 サーバログも追記します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問