前提・実現したいこと
経費申請アプリを作成しています。
初めての質問となりますので、語句の誤り・情報の不足があればご指摘ください。
子のオブジェクトを新規作成した場合に
作成内容に応じて親オブジェクトのカラムを編集したいです。
テスト環境で操作した場合は意図通りに動作しますが、テストにパスしないため
テスト内容に不備がないかご指摘いただけないでしょうか。
発生している問題・エラーメッセージ
adminが申請を承認する際、申請オブジェクトとユーザーに紐づく承認オブジェクトを作成します。
承認コントローラのcreateアクションにて、以下の処理を行っています。
①承認オブジェクトを作成する。
newページの承認リンク(承認or否認)にそれぞれパラメータを持たせており、この値に応じて
承認オブジェクトの承認ステータスをtrueまたはfalseと設定します。
②申請オブジェクトを呼び出し、承認オブジェクトの承認ステータスに応じて
親オブジェクトの承認ステータスに反映させる(一致させる)。
上記の内容を統合テストに記述しましたが
テスト内では②の処理が行われていないようで、以下の通り失敗します。
原因が分かる方いらっしゃいましたら、よろしくお願いいたします。
$ rails t Started with run options --seed 4862 FAIL ApproverActionTest#test_admin_user_can_approve_other_statement (1.84s) Expected: true Actual: false test/integration/approver_action_test.rb:26:in `block in <class:ApproverActionTest>' #なお、テスト実行後の各オブジェクトは以下のようになっています。 #申請オブジェクト(親) <TripStatement id: 777684020, distination: "kyoto", purpose: "recruit", start_at: "2021-04-15 08:34:55", finish_at: "2021-04-15 21:34:55", work_done_at: "2021-04-15 18:34:55", applied: true, applied_at: "2021-04-20 08:34:55", approved: false, approved_at: nil, user_id: 1038133505, created_at: "2021-06-08 23:45:42", updated_at: "2021-06-08 23:45:42"> #承認オブジェクト(子) <Approval id: 980191026, trip_statement_id: 777684020, approval: true, comment: nil, created_at: "2021-06-08 23:45:44", updated_at: "2021-06-08 23:45:44", user_id: 617136053>
###app/views/approval/new.html.erb
<% provide(:title, "承認画面") %> <h1>承認画面</h1> <h3>出張情報</h3> <%# 情報の表示のみなので割愛 %> <% if @trip_statement.user_id != current_user.id %> <h3>承認</h3> <%= link_to "承認する", trip_statement_approval_index_path(@trip_statement.id, approval: "false"), method: :post, class:"btn btn-primary btn-block btn-block" %> <%= link_to "否認する", trip_statement_approval_index_path(@trip_statement.id, :approval => "false"), method: :post, class:"btn btn-primary btn-block btn-block" %> <% end %>
###app/controllers/approval_controller.rb
class ApprovalController < ApplicationController before_action :authenticate_user! before_action :admin_user? before_action :same_company?, only: [:new, :create, :edit, :update] before_action :approve?, only: [:new, :create] before_action :applied?, only: [:new, :create, :edit, :update] # newとcreateと関連するメソッドを抜粋してます。 def new @trip_statement = TripStatement.find(params[:trip_statement_id]) @user = current_user @approval = @user.approval.build(trip_statement_id: @trip_statement.id) @expences = @trip_statement.expences.all #承認画面にて、紐づく旅費全てを表示する。 end def create @trip_statement = TripStatement.find(params[:trip_statement_id]) if params[:approval] == "true" @approval = current_user.approval.create(trip_statement_id: @trip_statement.id, approval: true) @approval.trip_statement.update(approved: true, approved_at: Time.zone.now) elsif params[:approval] == "false" @approval = current_user.approval.create(trip_statement_id: @trip_statement.id, approval: false) @trip_statement.update(approved: false, approved_at: Time.zone.now) else redirect_to trip_statement_approval_index_path flash[:warning] = "問題が発生しました。再度お試しください。" end @trip_statement.save # @approval.save if params[:approval] == "true" flash[:success] = "承認しました!" elsif params[:approval] == "false" flash[:warning] = "否認しました。" end redirect_to trip_statement_approval_index_url end private def admin_user? redirect_to root_url unless current_user.admin end def approve? @trip_statement = TripStatement.find(params[:trip_statement_id]) if @trip_statement.approved redirect_to trip_statement_approval_index_url flash[:danger] = "承認済の申請です。" end end def applied? @trip_statement = TripStatement.find(params[:trip_statement_id]) if @trip_statement.applied == false redirect_to trip_statement_approval_index_url flash[:danger] = "未提出の申請です。" end end def same_company? @trip_statement = TripStatement.find(params[:trip_statement_id]) if @trip_statement.user.company_id != current_user.company_id redirect_to trip_statement_approval_index_url flash[:danger] = "他社の申請は操作できません" end end end
test/integration/approver_action_test.rb
def setup @user = users(:my_normal) @approver = users(:my_admin) end test "admin_user can approve other statement" do login_as(@approver) @other_users_statement = trip_statements(:my_applied_statement) get approval_index_path assert_template 'approval/index' get new_trip_statement_approval_path(@other_users_statement) assert_template 'approval/new' assert_difference 'Approval.count', 1 do post trip_statement_approval_index_path(@other_users_statement), params: { approval: "true" } @approval = Approval.last end assert_equal true, @approval.approval assert_equal @user.id, @other_users_statement.user_id assert_equal true, @other_users_statement.approved #=> falseになる end
###test/fixtures/trip_statements.yml
my_applied_statement: distination: kyoto purpose: recruit start_at: 2021-04-15 08:34:55 finish_at: 2021-04-15 21:34:55 work_done_at: 2021-04-15 18:34:55 applied: true applied_at: 2021-04-20 08:34:55 approved: false user: my_normal
###test/fixtures/users.yml
my_admin: company: MY # department_id: name: my_admin email: my_admin@my.com birthday: 1995-06-17 admin: true system_admin: false encrypted_password: <%= Devise::Encryptor.digest(User, 'password') %> my_normal: company: MY # department_id: name: my_normal email: my_normal@my.com birthday: 1997-07-25 admin: false system_admin: false encrypted_password: <%= Devise::Encryptor.digest(User, 'password') %>
補足情報(FW/ツールのバージョンなど)
・Ruby: 2.6.6
・rails: 5.2.5
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/07/04 11:00