Ruby on Rails チュートリアルを勉強してます。
第10章→10.2 認可→10.17: テストユーザーでログインする green
の箇所で行き詰ってます。
テストはGreenでパスする例なのですが、テストが通りません。
nilエラーになってしまいます。
原因分かる方教えて下さい。
ちなみに、チュートリアルではモデル名は、User(ユーザー)ですが、
こちらはWorker(ワーカー)という名前に変更してます。
宜しくお願い致します。
エラーメッセージ
txt
1ERROR["test_successful_edit", WorkersEditTest, 0.5882816000003004] 2 test_successful_edit#WorkersEditTest (0.59s) 3NoMethodError: NoMethodError: undefined method `[]' for nil:NilClass 4 app/controllers/worker_sessions_controller.rb:6:in `create' 5 test/test_helper.rb:26:in `log_in_as' 6 test/integration/workers_edit_test.rb:23:in `block in <class:WorkersEditTest>' 7 8ERROR["test_unsuccessful_edit", WorkersEditTest, 0.5951644939996186] 9 test_unsuccessful_edit#WorkersEditTest (0.60s) 10NoMethodError: NoMethodError: undefined method `[]' for nil:NilClass 11 app/controllers/worker_sessions_controller.rb:6:in `create' 12 test/test_helper.rb:26:in `log_in_as' 13 test/integration/workers_edit_test.rb:9:in `block in <class:WorkersEditTest>' 14 15 26/26: [========================================] 100% Time: 00:00:00, Time: 00:00:00 16 17Finished in 0.63431s 1826 tests, 55 assertions, 0 failures, 2 errors, 0 skips
テストプログラム
/XXX/test/integration/workers_edit_test.rb
ruby
1require 'test_helper' 2 3class WorkersEditTest < ActionDispatch::IntegrationTest 4 def setup 5 @worker = workers(:michael) 6 end 7 8 test "unsuccessful edit" do 9 log_in_as(@worker) 10 get edit_worker_path(@worker) 11 assert_template 'workers/edit' 12 patch worker_path(@worker), params: { worker: { name: "", 13 email: "foo@invalid", 14 password: "foo", 15 password_confirmation: "bar" } } 16 17 assert_template 'workers/edit' 18 19 end 20 21 22 test "successful edit" do 23 log_in_as(@worker) 24 get edit_worker_path(@worker) 25 assert_template 'workers/edit' 26 name = 'Foo Bar' 27 email = "foo@bar.com" 28 patch worker_path(@worker), params: { worker: { name: name, 29 email: email, 30 password: "", 31 password_confirmation: "" } } 32 33 34 assert_not flash.empty? 35 assert_redirected_to @worker 36 @worker.reload 37 assert_equal name, @worker.name 38 assert_equal email, @worker.email 39 40 end 41 42 43 44 45 46 47end 48
テスト・ヘルパー
/XXX/test/test_helper.rb
ruby
1ENV['RAILS_ENV'] ||= 'test' 2require File.expand_path('../../config/environment', __FILE__) 3require 'rails/test_help' 4require "minitest/reporters" 5Minitest::Reporters.use! 6 7class ActiveSupport::TestCase 8 9 fixtures :all 10 11 # テストワーカーがログイン中の場合にtrueを返す 12 def is_logged_in? 13 !session[:worker_id].nil? 14 end 15 16 # テストワーカーとしてログインする 17 def log_in_as(worker) 18 session[:worker_id] = worker.id 19 end 20 21end 22 23class ActionDispatch::IntegrationTest 24 # テストワーカーとしてログインする 25 def log_in_as(worker, password: 'password', remember_me: '1') 26 post workers_login_path, params: { session: { email: worker.email, 27 password: password, 28 remember_me: remember_me } } 29 end 30end 31
コントローラ
/XXX/app/controllers/workers_controller.rb
ruby
1class WorkersController < ApplicationController 2 3 before_action :logged_in_worker, only: [:edit, :update] 4 5 def new 6 @worker = Worker.new 7 end 8 9 def show 10 @worker = Worker.find(params[:id]) 11 12 end 13 14 def create 15 @worker = Worker.new(worker_params) 16 if @worker.save 17 log_in @worker 18 redirect_to @worker 19 flash[:success] = "ようこそ!" 20 else 21 render 'new' 22 end 23 24 end 25 26 def edit 27 @worker = Worker.find(params[:id]) 28 end 29 30 def update 31 @worker = Worker.find(params[:id]) 32 if @worker.update_attributes(worker_params) 33 flash[:success] = "プロフィールを更新しました" 34 redirect_to @worker 35 else 36 render 'edit' 37 end 38 end 39 40 41 def destroy 42 43 end 44 45 46 private 47 def worker_params 48 params.require(:worker).permit(:name, :email, :password,:password_confirmation) 49 end 50 51 # ログイン済みユーザーかどうか確認 52 def logged_in_worker 53 unless logged_in? 54 flash[:danger] = "ログインしてください" 55 redirect_to workers_login_url 56 end 57 end 58 59end 60
/xxx/app/controllers/worker_sessions_controller.rb
ruby
1 2class WorkerSessionsController < ApplicationController 3 def new 4 end 5 6 def create 7 worker = Worker.find_by(email: params[:worker_session][:email].downcase) 8 if worker && worker.authenticate(params[:worker_session][:password]) 9 # ログイン後にリダイレクトする 10 log_in worker 11 params[:worker_session][:remember_me] == '1' ? remember(worker) : forget(worker) 12 redirect_to worker 13 14 else 15 # エラーメッセージを作成する 16 flash.now[:danger]="メールアドレスかパスワードが間違っています" 17 render 'new' 18 end 19 20 end 21 22 def destroy 23 log_out if logged_in? 24 redirect_to root_url 25 end 26 27end 28
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/05 10:37
2019/07/09 03:32