Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

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

1Answer

    sign_in_as(FactoryBot.create(:user))
    event1 = FactoryBot.create(:event,owner: current_user )

ここでサインインしているユーザーと event の owner であるユーザーが異なるからではないでしょうか。 sign_in_as(current_user) とすれば動くかもしれません。

0Like

Comments

  1. @Shunsuke2967

    Questioner

    返信が遅くなりすいません。
    お答えいただきありがとうございます。

    sigin_in_asの引数の時点でcurrent_userにユーザーが入るようになっています。

    ```
    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
    ```

    なのでownerのカラムにcurrent_userを指定しているので、ここで紐付いたeventが作成されるはずなのですが、作成されずに、見つけられません。

    ```
    #ここで紐付いたeventを作成できるはず
    event1 = FactoryBot.create(:event,owner: current_user )
    ```

Your answer might help someone💌