🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
RSpec

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

Ruby on Rails

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

Q&A

解決済

1回答

1546閲覧

rails、Rspecで テスト実行時のエラーを解決したい。

kit1987

総合スコア16

RSpec

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

Ruby on Rails

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

0グッド

0クリップ

投稿2019/11/01 22:32

前提・実現したいこと

railsでポートフォリオを作成しており、Rspecでテスト実行したところ以下のようなエラーが出ておりもしわかる方がいればご教授いただきたいです。

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

1) 投稿管理機能 詳細表示機能 ユーザーAがログインしているとき ユーザーAが作成した投稿が表示される Failure/Error: visit post_path(post_a) NoMethodError: undefined method `set_post' for #<PostsController:0x000055c74078ad90> Did you mean? set_response! # /usr/local/bundle/gems/rack-2.0.7/lib/rack/tempfile_reaper.rb:15:in `call' # /usr/local/bundle/gems/rack-2.0.7/lib/rack/etag.rb:25:in `call' # /usr/local/bundle/gems/rack-2.0.7/lib/rack/conditional_get.rb:25:in `call' # /usr/local/bundle/gems/rack-2.0.7/lib/rack/head.rb:12:in `call' # /usr/local/bundle/gems/rack-2.0.7/lib/rack/session/abstract/id.rb:232:in `context' # /usr/local/bundle/gems/rack-2.0.7/lib/rack/session/abstract/id.rb:226:in `call' # /usr/local/bundle/gems/railties-5.2.3/lib/rails/rack/logger.rb:38:in `call_app' # /usr/local/bundle/gems/railties-5.2.3/lib/rails/rack/logger.rb:26:in `block in call' # /usr/local/bundle/gems/railties-5.2.3/lib/rails/rack/logger.rb:26:in `call' # /usr/local/bundle/gems/rack-2.0.7/lib/rack/method_override.rb:22:in `call' # /usr/local/bundle/gems/rack-2.0.7/lib/rack/runtime.rb:22:in `call' # /usr/local/bundle/gems/rack-2.0.7/lib/rack/sendfile.rb:111:in `call' # /usr/local/bundle/gems/railties-5.2.3/lib/rails/engine.rb:524:in `call' # /usr/local/bundle/gems/rack-2.0.7/lib/rack/urlmap.rb:68:in `block in call' # /usr/local/bundle/gems/rack-2.0.7/lib/rack/urlmap.rb:53:in `each' # /usr/local/bundle/gems/rack-2.0.7/lib/rack/urlmap.rb:53:in `call' # /usr/local/bundle/gems/rack-2.0.7/lib/rack/builder.rb:153:in `call' # /usr/local/bundle/gems/rack-test-1.1.0/lib/rack/mock_session.rb:29:in `request' # /usr/local/bundle/gems/rack-test-1.1.0/lib/rack/test.rb:266:in `process_request' # /usr/local/bundle/gems/rack-test-1.1.0/lib/rack/test.rb:129:in `custom_request' # /usr/local/bundle/gems/rack-test-1.1.0/lib/rack/test.rb:58:in `get' # /usr/local/bundle/gems/capybara-3.29.0/lib/capybara/rack_test/browser.rb:65:in `process' # /usr/local/bundle/gems/capybara-3.29.0/lib/capybara/rack_test/browser.rb:43:in `process_and_follow_redirects' # /usr/local/bundle/gems/capybara-3.29.0/lib/capybara/rack_test/browser.rb:23:in `visit' # /usr/local/bundle/gems/capybara-3.29.0/lib/capybara/rack_test/driver.rb:45:in `visit' # /usr/local/bundle/gems/capybara-3.29.0/lib/capybara/session.rb:276:in `visit' # /usr/local/bundle/gems/capybara-3.29.0/lib/capybara/dsl.rb:51:in `block (2 levels) in <module:DSL>' # ./spec/system/posts_spec.rb:38:in `block (4 levels) in <top (required)>' Finished in 7.73 seconds (files took 10.2 seconds to load) 3 examples, 1 failure Failed examples: rspec ./spec/system/posts_spec.rb:41 # 投稿管理機能 詳細表示機能 ユーザーAがログインしているとき ユーザーAが作成した投稿が表示される

該当のソースコード

rails

1require 'rails_helper' 2 3RSpec.describe '投稿管理機能', type: :system do 4 let(:user_a) { create(:user, name: 'ユーザーA', email: 'a@example.com') } 5 let(:user_b) { create(:user, name: 'ユーザーB', email: 'b@example.com') } 6 let!(:post_a) { create(:post, name: '最初の投稿', user: user_a ) } 7 8 before do 9 visit login_path 10 fill_in 'メールアドレス', with: login_user.email 11 fill_in 'パスワード', with: login_user.password 12 click_button 'ログインする' 13 end 14 15 describe '一覧表示機能' do 16 context 'ユーザーAがログインしている時' do 17 let(:login_user) { user_a } 18 19 it 'ユーザーAが作成した投稿が表示される' do 20 expect(page).to have_content '最初の投稿' 21 end 22 end 23 24 context 'ユーザーBがログインしているとき' do 25 let(:login_user) { user_b } 26 27 it 'ユーザーAが作成した投稿が表示されない' do 28 expect(page).to have_no_content '最初の投稿' 29 end 30 end 31 end 32 33 describe '詳細表示機能' do 34 context 'ユーザーAがログインしているとき' do 35 let(:login_user) { user_a } 36 37 before do 38 visit post_path(post_a) 39 end 40 41 it 'ユーザーAが作成した投稿が表示される' do 42 expect(page).to have_content '最初の投稿' 43 end 44 end 45 end 46end

試したこと

自分の見解としてpost_aがちゃんと定義されていないのかと思い、サンプルコードと見比べましたが特にずれているところもなかったので見当がつかなくなってきたので質問させていただきました。
もしわかる方いればご教授お願いいたします。

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

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

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

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

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

winterboum

2019/11/02 04:39

undefined method `set_post' for #<PostsControlle とありますので、controllerのcodeを開示いただくのが解決が早いです
kit1987

2019/11/02 12:34 編集

返信が遅くなりました。 ご指摘ありがとうございます。 以下該当のコントローラー のコードです rails posts_controller.rb class PostsController < ApplicationController before_action :set_post, only: [:show, :edit, :update, :destroy] def index @posts = current_user.posts.order(created_at: :desc) end def show end def new @post = Post.new end def create @post = current_user.posts.new(post_params) if @post.save redirect_to @post, notice: "投稿「#{@post.name}」を登録しました。" else render :new end end def edit end def update @post.update!(post_params) redirect_to posts_url, notice: "投稿「#{post.name}」を更新しました。" end def destroy @post.destroy redirect_to posts_url, notice: "投稿「#{post.name}」を削除しました。" end private def post_params params.require(:post).permit(:name, :description) def set_post @post = current_user.posts.find(params[:id]) end end end ローカル環境では正常に機能は動作するのですがset_postが定義されていないと言うことでしょうか?
guest

回答1

0

ベストアンサー

before_action :set_post, only: [:show, :edit, :update, :destroy]
という記述があります。
showを呼ぶときに set_post methodを実行せよという記述です。
が、conrollerにそれがありません。

def set_post
@post = Post.find(params[:id])
end

とか定義して下さい
#####
あ、あるね。そのエラーが出ているから無いものと思い込んだ。
も少し考えます

####
def post_params が閉じていないから、def set_post が死んでる

投稿2019/11/02 12:45

編集2019/11/02 12:50
winterboum

総合スコア23567

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

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

kit1987

2019/11/02 13:06

ご返答ありがとうございます。 def post_paramsを閉じたら無事解決しました。単純なミスで失礼しました。 今後はちゃんとエラー内容を細く読んで解決していきます。 対応いただきありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問