##現状
現在、Railsでアプリケーションを作成しています。
RSpecのrequestsスペックにてコントローラーのテストを行っているのですが、destroyアクションのテストで躓いているため、わかる方いましたら教えてください。
挙動としては以下を想定しています。
- 管理者(admin: true) → 削除が行える
- 管理者以外(admin: false) → 削除は行われずトップページにリダイレクトする
以下のコードでテストを行ったのですが、削除が思ったように行われません。(なぜか削除したい時に削除されず、削除して欲しくない時に削除されるという結果が返ってきています。)
トップページへのリダイレクトに関するテストは通ります。
requestspec
1describe '#destroy' do 2 let(:admin_user) { FactoryBot.create(:user, admin: true) } 3 let(:user) { FactoryBot.create(:user, admin: false) } 4 let(:laundry) { FactoryBot.create(:laundry) } 5 6 context '管理者の場合' do 7 it '店舗情報を削除できること' do 8 sign_in admin_user 9 expect { 10 delete laundry_path(laundry) 11 }.to change { Laundry.count }.by(-1) 12 end 13 end 14 15 context '認可されていないユーザーの場合' do 16 it '店舗情報を削除できないこと' do 17 sign_in user 18 expect { 19 delete laundry_path(laundry) 20 }.to_not change { Laundry.count } 21 end 22 23 it 'トップページにリダイレクトすること' do 24 sign_in user 25 delete laundry_path(laundry) 26 expect(response).to redirect_to root_path 27 end 28 end
エラー文↓
1) Laundries #destroy 管理者の場合 店舗情報を削除できること Failure/Error: expect { delete laundry_path(laundry) }.to change { Laundry.count }.by(-1) expected `Laundry.count` to have changed by -1, but was changed by 0 # ./spec/requests/laundries_spec.rb:226:in `block (4 levels) in <top (required)>' 2) Laundries #destroy 認可されていないユーザーの場合 店舗情報を削除できないこと Failure/Error: expect { delete laundry_path(laundry) }.to_not change { Laundry.count } expected `Laundry.count` not to have changed, but did change from 0 to 1 # ./spec/requests/laundries_spec.rb:240:in `block (4 levels) in <top (required)>'
controller
1 2 before_action :check_user, except: [:index, :show, :search] 3 4 def destroy 5 laundry = Laundry.find(params[:id]) 6 if laundry.destroy 7 redirect_to root_path, notice: '削除が完了しました' 8 else 9 redirect_to root_path, alert: '削除が失敗しました' 10 end 11 end 12 13private 14 15 def check_user 16 redirect_to root_path unless user_signed_in? && current_user.admin? 17 end
##質問内容
let(:laundry) { FactoryBot.create(:laundry) }
をlet!(:laundry) { FactoryBot.create(:laundry) }
にするとテストが成功するのですが、なぜlet!
にすることで成功するのかがわかりません。
そもそも自分が書いたテストコード自体が間違っているのでしょうか?
わかる方いましたら教えていただきたいです。
よろしくお願いいたします。
##開発環境
- rails (6.0.3.3)
- ruby (2.6.5)
- rspec-rails (4.0.1)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2020/11/23 23:49