概要
勉強とポートフォリオ作成を兼ねて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のテストについて
やっていることを下記します
- ログインする
- ユーザ一覧ページへ移動
assert_template
- paginationがあるか
- 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通るようになりました。
ありがとうございました。