解決したいこと
rails tutorial10章で10.4.3 ユーザー削除のテストを実装して、テストをしてみたところ下記のエラーが出てきて、対処方法を知りたい。
ec2
1Running via Spring preloader in process 3777 2Run options: --seed 40217 3 4# Running: 5 6..................................EE. 7 8Finished in 1.692131s, 21.8659 runs/s, 70.3255 assertions/s. 9 10 1) Error: 11UsersIndexTest#test_index_as_non-admin: 12NoMethodError: undefined method `email' for nil:NilClass 13 test/test_helper.rb:24:in `log_in_as' 14 test/integration/users_index_test.rb:36:in `block in <class:UsersIndexTest>' 15 16 2) Error: 17UsersIndexTest#test_index_as_admin_including_pagination_and_delete_links: 18NoMethodError: undefined method `email' for nil:NilClass 19 test/test_helper.rb:24:in `log_in_as' 20 test/integration/users_index_test.rb:19:in `block in <class:UsersIndexTest>' 21 2237 runs, 119 assertions, 0 failures, 2 errors, 0 skips 23
また、NoMethodError: undefined method `メソッド名' for nil:NilClassというエラーはスペルミスかレシバーがnilというパターンがあり、もしレシバーがnilがエラー原因の時に皆さんが良く行う対処方法を教えて頂きたいです。
関連ファイル
test/test.helper.rb
ENV['RAILS_ENV']
1require File.expand_path('../../config/environment', __FILE__) 2require 'rails/test_help' 3 4class ActiveSupport::TestCase 5 # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. 6 fixtures :all 7 8 # テストユーザーがログイン中の場合にtrueを返す 9 def is_logged_in? 10 !session[:user_id].nil? 11 end 12 13 # テストユーザーとしてログインする 14 def log_in_as(user) 15 session[:user_id] = user.id 16 end 17end 18 19class ActionDispatch::IntegrationTest 20 21 # テストユーザーとしてログインする 22 def log_in_as(user, password: 'password', remember_me: '1') 23 post login_path, params: { session: { email: user.email, 24 password: password, 25 remember_me: remember_me } } 26 end 27end
test/integration/users_index_test.rb
require
1 2class UsersIndexTest < ActionDispatch::IntegrationTest 3 def setup 4 @user = users(:michael) 5 end 6 7 test "index including pagination" do 8 log_in_as(@user) 9 get users_path 10 assert_template 'users/index' 11 assert_select 'div.pagination' 12 User.paginate(page: 1).each do |user| 13 assert_select 'a[href=?]', user_path(user), text: user.name 14 end 15 end 16 17 test "index as admin including pagination and delete links" do 18 log_in_as(@admin) 19 get users_path 20 assert_template 'users/index' 21 assert_select 'div.pagination' 22 first_page_of_users = User.paginate(page: 1) 23 first_page_of_users.each do |user| 24 assert_select 'a[href=?]', user_path(user), text: user.name 25 unless user == @admin 26 assert_select 'a[href=?]', user_path(user), text: 'delete' 27 end 28 end 29 assert_difference 'User.count', -1 do 30 delete user_path(@non_admin) 31 end 32 end 33 34 test "index as non-admin" do 35 log_in_as(@non_admin) 36 get users_path 37 assert_select 'a', text: 'delete', count: 0 38 end 39end
controllers/user_contoller.rb
class
1 before_action :logged_in_user, only: [:index, :edit, :update, :destroy] 2 before_action :correct_user, only: [:edit, :update] 3 before_action :admin_user, only: :destroy 4 5 def index 6 @users =User.paginate(page: params[:page]) 7 end 8 9 def show 10 @user = User.find(params[:id]) 11 end 12 13 def new 14 @user = User.new 15 end 16 17 def create 18 @user = User.new(user_params) 19 if @user.save 20 log_in @user 21 flash[:success] = "Welcome to the Sample App!" 22 redirect_to @user 23 else 24 render 'new' 25 end 26 end 27 28 def edit 29 @user = User.find(params[:id]) 30 end 31 32 def update 33 @user = User.find(params[:id]) 34 if @user.update_attributes(user_params) 35 flash[:success] = "Profile updated" 36 redirect_to @user 37 else 38 render 'edit' 39 end 40 end 41 42 def destroy 43 User.find(params[:id]).destroy 44 flash[:success] = "User deleted" 45 redirect_to users_url 46 end 47 48 private 49 50 def user_params 51 params.require(:user).permit(:name, :email, :password, 52 :password_confirmation) 53 end 54 55 # beforeアクション 56 57 # ログイン済みユーザーかどうか確認 58 def logged_in_user 59 unless logged_in? 60 store_location 61 flash[:danger] = "Please log in." 62 redirect_to login_url 63 end 64 end 65 66 # 正しいユーザーかどうか確認 67 def correct_user 68 @user = User.find(params[:id]) 69 redirect_to(root_url) unless current_user?(@user) 70 end 71 72 # 管理者かどうか確認 73 def admin_user 74 redirect_to(root_url) unless current_user.admin? 75 end 76 77end
使用しているツール
AWS、cloud9、rails5.1.2
初心者なのでエラー箇所の見るべきコードが分かっても、どう実装すればいいかまでは理解できていません。
どうか、よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/29 07:25
2020/06/30 01:49