前提・実現したいこと
この質問を見ていただき、ありがとうございます。
RSpecを使ってコントローラのテストをしています。
正常に動作していることを確認するテストをパスできない状況です。
テストをパスする方法について教えていただきたくお願い致します。
エラーメッセージ
ContentsController get #edit リクエストは200 OKとなること (FAILED - 1) Failures: 1) ContentsController get #edit リクエストは200 OKとなること Failure/Error: expect(response.status).to eq(200) expected: 200 got: 302 (compared using ==) # ./spec/controllers/contents_controller_spec.rb:13:in `block (3 levels) in <top (required)>'
該当のソースコード
Ruby
1# spec/controllers/contents_controller_spec.rb 2 3require 'rails_helper' 4 5describe ContentsController do 6 let(:user) { create(:user) } 7 8 describe 'get #edit' do 9 before do 10 login user 11 end 12 it 'リクエストは200 OKとなること' do 13 content = create(:content) 14 get :edit, params: { id: content } 15 expect(response.status).to eq(200) 16 end 17 end 18end
ユーザーの管理はdeviseを使用しており、
ログインしている状態でないとcontentを編集できないようにしているため、beforeで先にログインをしています。
なお、userとcontentの関係性は下記の通りです。
userはhas_many :contents
contentはbelongs to :user
Ruby
1# spec/factories/users.rb 2FactoryBot.define do 3 password = Faker::Internet.password(min_length: 8) 4 factory :user do 5 name { Faker::Name.last_name } 6 email { Faker::Internet.free_email } 7 password { password } 8 password_confirmation { password } 9 end 10end 11 12 13# spec/factories/contents.rb 14FactoryBot.define do 15 factory :content do 16 name {"editテスト"} 17 image {File.open("#{Rails.root}/public/image/test_image.png")} 18 user 19 end 20end
Ruby
1 2# spec/support/controller_macros.rb 3 4module ControllerMacros 5 def login(user) 6 @request.env["devise.mapping"] = Devise.mappings[:user] 7 sign_in user 8 end 9end 10
Ruby
1# app/controllers/contents_controller.rb 2 3class ContentsController < ApplicationController 4 def edit 5 @content = Content.find(params[:id]) 6 if current_user.id != @content.user_id 7 redirect_to root_path 8 end 9 end 10end
試したこと
spec/controllers/contents_controller_spec.rb
の中で、
content = create(:content)
をした後でbinding.pryを使って作成されたデータの内容を確認しました。
userのidと、contentのuser_idが異なっていることがわかりました。
具体的には、userデータのidが28だとすると、contentデータのuser_idが29となっていて1個ずれている状態でした。
spec/factories/contents.rb
の
user
部分をassociation :user
に変えて再度試してみましたが、同じエラーメッセージが出ました。
補足情報
ruby 2.6.5
Rails 6.0.3.2
あなたの回答
tips
プレビュー