3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

railsでkaminariを使ってpaginationを作りそのテストをRspecで書こうとしてハマりました

Posted at

概要

勉強とポートフォリオ作成を兼ねてrails tutorialをなぞりながらtestをminitestではなくRspecで書いて見ようと試みていたところ、
第10章のPaginationの箇所でハマったので(他にも色々ハマっていますが)投稿記事として無難かなという思いと個人的な備忘録としても書いとこうと思います。

環境

rails tutorial 6版とはGemのverが一部異なります。
kaminariとrspec-railsを入れてます

Gemfiles.rb
# 抜粋です

ruby '2.7.4'

gem 'bootstrap',                  '~> 4.6.0'
gem 'kaminari'
gem 'rails',                      '6.0.3'
gem 'rails-i18n'

group :test do
  gem 'capybara',                 '3.28.0'
  gem 'factory_bot_rails'
  gem 'rails-controller-testing', '1.0.4'
  gem 'rspec-rails'
  gem 'selenium-webdriver',       '3.142.4'
  gem 'webdrivers',               '4.1.2'
end

ハマったところ

tutorial リスト 10.48のテストについて
やっていることを下記します

  1. ログインする
  2. ユーザ一覧ページへ移動
  3. assert_template
  4. paginationがあるか
  5. 1page目に表示されているすべてのuserのリンクが正しいことの確認
    rspecに書く際、3.はtitleを確認することでお茶を濁しています。
    ハマったのは5.です。

結論

1ページのレコード数(今回はユーザー数)はperメソッドで変更してもrspecでのtestはデフォルトの25で検査を強行されるので、
kaminari_config.rbを作ってデフォルトを変更するべし

状況

user_controller.rb
# 抜粋
  def index
    # pageとperがkaminariで定義されたメソッド perメソッドの引数にどれだけのレコード
    # (この場合はユーザー)が表示されたらページを増やすかを指定する
    @users = User.page(params[:page]).per(10)
  end

RspecはSystem_specでやってます

spec/systems/users_index_spec.rb
require 'rails_helper'

RSpec.describe 'user_index', type: :system do
  describe 'ユーザ一覧を開いたとき' do
    let!(:first_user) { FactoryBot.create(:user) }

    it 'ページネーションが存在しページ遷移ができること' do
      # create_listでFactoryBotから模擬ユーザを量産
      create_list(:user, 25)
      # login_asヘルパーメソッドはsupport/test_helper内で定義
      login_as(first_user)
      visit users_path
      expect(page.title).to eq full_title('ユーザ一覧')
      # ページネーションが上下で2つあることを確認する
      expect(page).to have_selector '.pagination', count: 2
      # 最初のページ2へのリンクをクリックする
      click_on '2', match: :first
      # ユーザーフレンドリー+ページキャッシュのために下記で通るようにroutes.rbで細工してる
      expect(current_path).to eq '/users/page/2'
      click_on '1', match: :first
      User.page(1).each do |user|
        expect(page).to have_link href: "/users/#{user.id}" # この部分でエラーが起こる
      end
    end
  end
end

ご参考にroutes.rbの細工箇所です

routes.rb
#下記でpagination 2page目のPathが/users/page/2 とできる
  resources :users do
    get 'page/:page', action: :index, on: :collection
  end

解決策

結論で書きましたが、kaminari_config.rbを作ります。

$ rails g kaminari:config
    create  config/initializers/kaminari_config.rb

作ったファイルでデフォルトのper_pageを変更します。

config/initializers/kaminari_config.rb
# frozen_string_literal: true

Kaminari.configure do |config|
  config.default_per_page = 10 # ここの部分のコメントを外し25 ⇨ 10にしました
  # config.max_per_page = nil
  # config.window = 4
  # config.outer_window = 0
  config.left = 2
  config.right = 1
  # config.page_method_name = :page
  # config.param_name = :page
  # config.max_pages = nil
  # config.params_on_first_page = false
end

user_controller内のper(10)は不要なので消しときます。
これでtest通るようになりました。
ありがとうございました。

3
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?