#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
エラー解決のためのアドバイスをいただけると幸いです。
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。