give IT a try

プログラミング、リモートワーク、田舎暮らし、音楽、etc.

Everyday Rails - RSpecによるRailsテスト入門がRails 7.1とRuby 3.3に対応しました!

お知らせ

僕が翻訳している電子書籍「Everyday Rails - RSpecによるRailsテスト入門」をアップデートしました🎉
すでに本書を購入されている方はLeanpubのサイトから最新版の電子書籍ファイルを無料でダウンロードできます。

leanpub.com

2024年版のアップデート内容

今回のアップデート内容は以下の通りです。

  • サンプルアプリケーションをRails 7.1 + Ruby 3.3 + rspec-rails 6.1で再作成
  • これに伴い、サンプルアプリのリポジトリURLも変更
  • 新しいサンプルアプリのコードや挙動にあわせて、本書の記述を修正
  • リンク切れしていたいくつかのリンクを新しいURLに修正

Rails 7.1で作った新しいサンプルアプリケーションは以下のGitHubリポジトリに置いています。

github.com

とはいえ、書籍としてはほとんど内容は変わっていません。
Rails 7.0も7.1もRSpecの使い方を学ぶ上では考え方を大きく変えるようなポイントはない、と思ってもらって大丈夫です。

細かすぎて伝わらない変更点

ほとんど同じ、とはいうものの、細かい点では若干変わっています。
その変更点に誰も気付かれないのはちょっと悲しいので、変更点をいくつか紹介します。

「タスク完了」のUIをHotwireを使って実装した

Everyday Railsのサンプルアプリには「タスク完了」のチェックボックスをクリックすると、即DBが更新される機能があります。
Rails 7.1版のサンプルアプリではこの機能をHotwireを使って実装してみました。

github.com

letter_opener_webを導入した

サンプルアプリではメールを送信する機能があるのですが、開発環境でメールがちゃんと送信できたのかどうかはRailsのログを確認するぐらいしかありませんでした。
(ただし、テストコード内ではRSpecを使って送信されたメールの内容をテストしています)

Rails 7.1版のサンプルアプリではletter_opener_webを導入しています。
そのため、 http://localhost:3000/letter_opener にアクセスすれば送信されたメールの内容が確認できます。


不要なアップロードファイルを削除するコードが変わった

Rails 7.1ではrails newしたタイミングで、tmp/storage/.keepというファイルが作成されます。
第10章ではこれまで

config.after(:suite) do
  FileUtils.rm_rf(ActiveStorage::Blob.service.root)
end

というコードで不要なアップロードファイルを削除していました。
ですが、これだとtmp/storage/.keepも一緒に削除してしまいます。
そこで、以下のコードに変更して不要なディレクトリだけを削除するようにしました。

config.after(:suite) do
  Pathname(ActiveStorage::Blob.service.root).each_child do |path|
    path.rmtree if path.directory?
  end
end

Rails 7.1やRuby 3.3では警告が発生する箇所の修正

いくつかのgemではRails 7.1やRuby 3.3で実行すると警告が出るものがあったので、Rails 7.1版のサンプルアプリケーションではやむを得ずGitHubリポジトリ上のgemのコードを参照するなどして警告の発生を回避しています。
これらの回避策はあくまで一時的なものなので、正式対応版がリリースされ次第、元のコードに直す予定です。

Capybara 3.39.2

2024.2.3追記
Capybara 3.40.0がリリースされて下記の問題が解消したため、サンプルアプリも最新のCapybaraを使うようにアップデートしました。

Rack 3を使っているとCapybaraが原因で"Rack::Handler is deprecated and replaced by Rackup::Handler" という警告が発生します。
github.com

すでに修正コードはmasterブランチにマージ済みですが、まだ正式リリースされていないため、GemfileでGitHub上のコードを参照するようにしています。

# Gemfile
# Waiting for https://github.com/teamcapybara/capybara/pull/2706 to be released
gem "capybara", github: "teamcapybara/capybara"
Geocoder 1.8.2

Ruby 3.3を使っていると、Geocoderが原因で以下のような警告が発生します。

warning: csv was loaded from the standard library, 
but will no longer be part of the default gems since Ruby 3.4.0. 
Add csv to your Gemfile or gemspec.

すでに修正コードはmasterブランチにマージ済みですが、まだ正式リリースされていないため、GemfileでGitHub上のコードを参照するようにしています。

# Gemfile
# Waiting for https://github.com/alexreisner/geocoder/issues/1642 to be released
gem "geocoder", github: "alexreisner/geocoder"

ちなみにgeocoderに修正のプルリクエストを送ったのは僕です。

github.com

また、Ruby 3.3で警告が出る理由については以下のQiita記事で説明しています。

qiita.com

Devise 4.9.3

Rails 7.1を使っていると、Deviseが原因で以下のような警告が発生します。

DEPRECATION WARNING: 
`Rails.application.secrets` is deprecated in favor of `Rails.application.credentials` 
and will be removed in Rails 7.2. 

この問題はIssueとしてすでに報告されていますが、2024年1月9日時点ではまだOpenのままです。

github.com

この警告を回避するため、config/initializers/devise.rbで以下の記述を追加しています。

# config/initializers/devise.rb
# NOTE: Please remove the following lines when https://github.com/heartcombo/devise/issues/5644 is fixed
require 'devise/version'
raise "Issue 5644 might be fixed" unless Devise::VERSION == "4.9.3"
config.secret_key = Rails.application.secret_key_base

まとめ

というわけで、このエントリでは「Everyday Rails - RSpecによるRailsテスト入門がRails 7.1とRuby 3.3に対応しましたよ」というお知らせを書いてみました。

Rails 7.0と7.1で変わる部分はほとんどないものの、公式に「Rails 7.1でも本書の内容は有効ですよ!」とアナウンスしてあれば、安心して本書を購入できるんじゃないかなと思います。

また、すでに本書を持っている人も、「変更点がほとんどない=本書で学んだRSpecの知識は最新の開発環境でもまだ有効」ということがわかって安心できるのではないでしょうか?

これからも引き続き最新版のRailsやRSpecに対応していく予定ですので、みなさん今後とも「Everyday Rails - RSpecによるRailsテスト入門」をよろしくお願いします。
(購入済みの方は周りの人にお勧めしてもらえると嬉しいです!😄)

leanpub.com

Q. どうやって購入するの?

本書の購入手順は以下のブログ記事で詳しく説明されているので、こちらをご覧ください。
tomoyuki65.com

また、そのほかのよくある質問に関しては以下のエントリにまとめています。
興味がある方はこちらをご覧ください。
blog.jnito.com

あわせて読みたい

「Everyday Rails - RSpecによるRailsテスト入門」も「プロを目指す人のためのRuby入門」も、「出版したら終わり、にしない技術書」を目指しております。