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

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

解決済

1回答

3552閲覧

Rspec NoMethodErrorを解決したいです

encho

総合スコア182

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クリップ

投稿2020/06/16 08:38

#Rspec NoMethodErrorについて

Ruby on Rails6 実践ガイドを用いてRspecのテストを書いています。
共通のexampleをspec/supportフォルダに以下のように記述しました。

Ruby

1 2shared_examples "a protected admin controller" do |controller| 3 let(:args) do 4 { 5 host: Rails.application.config.baukis2[:admin][:host], 6 controller: controller 7 } 8 end 9 10 describe "#index" do 11 example "ログインフォームにリダイレクト" do 12 get url_for(args.merge(action: :index)) 13 expect(response).to redirect_to(admin_login_url) 14 end 15 end 16 17 describe "#show" do 18 example "ログインフォームにリダイレクト" do 19 get url_for(args.merge(action: :show, id: 1)) 20 expect(response).to redirect_to(admin_login_url) 21 end 22 end 23end 24 25shared_examples "a protected singular admin controller" do |controller| 26 let(:args) do 27 { 28 host: Rails.application.config.baukis2[:admin][:host], 29 controller: controller 30 } 31 end 32 33 describe "#show" do 34 example "ログインフォームにリダイレクト" do 35 get url_for(args.merge(action: :show)) 36 expect(response).to redirect_to(admin_login_url) 37 end 38 end 39end

そして共通化させたexampleを以下のように利用しました。

Ruby

1require "rails_helper" 2 3describe "管理者による職員管理", "ログイン前" do 4 include_examples "a protected admin controller", "admin/staff_members" 5end 6 7describe "管理者による職員管理" do 8 let(:administrator) { create(:administrator)} 9 10 before do 11 post admin_session_url, 12 params: { 13 admin_login_form: { 14 email: administrator.email, 15 password: "pw" 16 } 17 } 18 end 19 20 describe "新規登録" do 21 let(:params_hash){ attributes_for(:staff_member)} 22 23 example "職員一覧ページにリダイレクト" do 24 post admin_staff_members_url, params: {staff_member: params_hash} 25 expect(response).to redirect_to(admin_staff_members_url) 26 end 27 28 example "例外ActionController::ParameterMissingが発生" do 29 expect {post admin_staff_members_url}.to raise_error(ActionController::ParameterMissing) 30 end 31 end 32 33 34 describe "更新" do 35 let(:staff_member){create(:staff_member)} 36 let(:params_hash){attributes_for(:staff_member)} 37 38 example "suspendedフラグをセットする" do 39 params_hash.merge!(suspended: true) 40 patch admin_staff_member_url(staff_member), params: {staff_member: params_hash} 41 staff_member.reload 42 expect(staff_member).to be_suspended 43 end 44 45 example "hashed_passwordの書き換えは不可" do 46 params_hash.delete(:password) 47 params_hash.merge!(hashed_password: "x") 48 expect { 49 patch admin_staff_member_url(staff_member), params: {staff_member: params_hash} 50 }.not_to change{staff_member.hashed_password.to_s} 51 end 52 end 53end

すると以下のようなエラーが発生しました。
url_forが定義されていないというエラーが出ているのですが、
具体的にどのように対応するべきかわかりません。
そもそも自分で定義するメソッドではないと思うのでconfig部分に問題があるかとも考えています。

terminal

11) 管理者による職員管理 ログイン前 #index ログインフォームにリダイレクト 2 Failure/Error: get url_for(args.merge(action: :index)) 3 4 NoMethodError: 5 undefined method `url_for' for #<RSpec::ExampleGroups::Nested::Index:0x000055e5ef02b798> 6 Shared Example Group: "a protected admin controller" called from ./spec/request/admin/staff_members_management_spec.rb:4 7 # ./spec/support/shared_examples_for_admin_controller.rb:11:in `block (3 levels) in <main>'

rails_helperは以下の通りです。

require 'spec_helper' ENV['RAILS_ENV'] ||= 'test' require File.expand_path('../config/environment', __dir__) abort("The Rails environment is running in production mode!") if Rails.env.production? require 'rspec/rails' Dir[Rails.root.join("spec", "support", "**", "*.rb")].each { |f| require f } begin ActiveRecord::Migration.maintain_test_schema! rescue ActiveRecord::PendingMigrationError => e puts e.to_s.strip exit 1 end RSpec.configure do |config| config.fixture_path = "#{::Rails.root}/spec/fixtures" config.use_transactional_fixtures = true config.infer_spec_type_from_file_location! config.filter_rails_from_backtrace! config.include FactoryBot::Syntax::Methods config.include ActiveSupport::Testing::TimeHelpers end

エラー解決のためのアドバイスをいただけると幸いです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

自己解決

フォルダ名が間違っていました。解決ゾロリ

投稿2020/06/16 08:42

encho

総合スコア182

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問