Rspecで保存されたはずのデータが無いというエラーが解決できない
解決したいこと
保存したEventデータを削除してちゃんと削除されたかどうかをデータの件数が減ったかで確認しようと思ったのですが、保存されているはずのデータがcontrollerのfindでデータがないと言われて解決できません。
発生している問題・エラー
1) 詳細ページ ページを表示し削除ボタンを押す
Got 1 failure and 1 other error:
1.1) Failure/Error:
expect {
page.accept_confirm do
click_on "イベントを削除する"
end
}.to change(Event,:count).by(- 1 )
expected `Event.count` to have changed by -1, but was changed by 0
[Screenshot]: /home/shunsuke/awesome_events/tmp/screenshots/failures_r_spec_example_groups_nested_ページを表示し削除ボタンを押す_481.png
# ./spec/system/events_spec.rb:23:in `block (2 levels) in <top (required)>'
#↓ここでレコードが見つからないと言われてエラーが出ている
1.2) Failure/Error: @event = current_user.created_events.find(params[:id])
ActiveRecord::RecordNotFound:
Couldn't find Event with 'id'=1 [WHERE "events"."owner_id" = ?]
[Screenshot]: /home/shunsuke/awesome_events/tmp/screenshots/failures_r_spec_example_groups_nested_ページを表示し削除ボタンを押す_481.png
# ./app/controllers/events_controller.rb:32:in `destroy'
# ------------------
# --- Caused by: ---
# Capybara::CapybaraError:
# Your application server raised an error - It has been raised in your test code because Capybara.raise_server_errors == true
# /home/shunsuke/.rbenv/versions/2.6.6/lib/ruby/gems/2.6.0/gems/capybara-3.36.0/lib/capybara/session.rb:160:in `raise_server_error!'
Finished in 11.31 seconds (files took 3.03 seconds to load)
4 examples, 1 failure
エラーが起きているテストコード
it 'ページを表示し削除ボタンを押す' do
sign_in_as(FactoryBot.create(:user))
event1 = FactoryBot.create(:event,owner: current_user )
visit event_path(event1)
expect {
# ↓ここでダイアログが出てokを押し後エラー(ActiveRecord::RecordNotFound)
page.accept_confirm do
click_on "イベントを削除する"
end
}.to change(Event,:count).by(- 1 )
end
end
ActiveRecord::RecordNotFoundが出ているコントローラー
def destroy
@event = current_user.created_events.find(params[:id])
@event.destroy!
redirect_to root_path, notice: "削除しました"
end
Userモデルの関連付け
has_many :created_events, class_name: "Event", foreign_key: "owner_id",dependent: :nullify
サインインに使っているヘルパーメソッド
module SignInSupport
def sign_in_as(user)
OmniAuth.config.test_mode = true
OmniAuth.config.add_mock(
user.provider,
uid: user.id,
info: { nickname: user.name,
image: user.image_url })
visit root_path
click_on "GitHubでログイン"
@current_user = user
end
def current_user
@current_user
end
end
factoryBot
FactoryBot.define do
factory :event do
owner
sequence(:name) { |i| "イベント名#{i}" }
sequence(:place) { |i| "イベント開催場所#{i}" }
sequence(:content) { |i| "イベント本文#{i}" }
start_at { rand(1..30).days.from_now }
end_at { start_at + rand(1..30).hours }
end
end
FactoryBot.define do
factory :user, aliases: [:owner] do
provider {"github"}
sequence(:uid) { |i| "uid#{i}" }
sequence(:name) { |i| "name#{i}" }
sequence(:image_url) { |i| "http://example.com/image#{i}.png" }
end
end
自分で試したこと
irbでFactoryが動いているか確認したり、テストの中でデータが保存されているか確認したのですが、データに保存はされているみたいです。
下記のコードでなぜデータが見つからないかわかりません。
@event = current_user.created_events.find(params[:id])
0