開発中のプロジェクトでrails6 -> rails7にした

基本は

https://railsguides.jp/upgrading_ruby_on_rails.html

の手順を守ればOKですがdocker 環境のせいかbundle updateが一晩かけても終わらなかったので、Gemfile.lockを削除してGemfilerailsのバージョンを書き換えてbundle installしました。

変更点はこれだけです。

gem 'rails', '~> 6.1.4', '>= 6.1.4.1'
gem 'rails', '~> 7.0.2', '>= 7.0.2.2'

gem 'rails-i18n', '~> 6.0.0'
gem 'rails-i18n', '~> 7.0.0'

webpackerはとりあえず使い続ける選択をしたので大きな問題はありませんでした。

ただ、rspecでsessionをmockしているところが動かなくなってました

allow_any_instance_of(ActionDispatch::Request)
  .to receive(:session)
  .and_return({id: 1})

理由はちゃんとわかってないですが、下記のようなヘルパーを作って対処しました

  def initialize_mock_session
    mock_session = allow_any_instance_of(ActionDispatch::Request::Session)
    # おまじない。↓のエラーの対策
    # Please stub a default value first if message might be received with other args as well.
    mock_session.to receive(:[]).and_call_original
    mock_session
  end

# 利用方法
mock_session.to receive(:[]).with(:id).and_return(1)