give IT a try

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

Everyday Railsの小規模なアップデートを実施しました

お知らせ

僕が翻訳者の1人として参加している電子書籍「Everyday Rails - RSpecによるRailsテスト入門」の小規模なアップデートを実施しました。

購入者の方にはおそらく通知メールが飛んでいるはずです。
アップデート版をダウンロードする場合はLeanpubにログインして、Libraryページにアクセスしてください。
(または通知メールに記載されたリンクからもダウンロードできます)

アップデート版のダウンロードはもちろん無料です。

Everyday Rails - RSpecによるRailsテスト入門 | Leanpub
f:id:JunichiIto:20180219082935p:plain

具体的なアップデート内容

今回のアップデートでは原著の2017年6月4日版に追従しました。
とはいえ、2017年6月4日版のアップデート内容はそれほど大規模なものではなく、いくつかの小粒なアップデートをまとめてリリースしたような内容になっています。

興味深い変更点をあえて挙げるなら、以下の2点でしょうか。

  • ChromeDriverのインストールにchromedriver-helper gemを使うようになったところ
  • Factory GirlがFactory Botに変わったところ

chromedriver-helperは便利なので僕もよく使っています。

また、Rails開発者であればFactoryGirlの名前がFactoryBotに変わったというニュースもすでにご存じなのではないでしょうか。

今回のアップデートにより、Everyday Railsを読む際にgemの名前を毎回頭の中で読み替えずに済みますね。

その他、環境やバージョンによる違いなど

Rails 5.2でも基本的な考え方は同じです

本書はRails 5.1を対象にしていますが、現時点(2018年7月)の最新版であるRails 5.2を使う場合でも基本的な考え方は同じなので、本書の内容はほぼそのまま適用可能です。

ただし、Rails 5.2とrspec-rails 3.7で動かす場合は、サンプルアプリケーションのテストコードで以下の変更が必要になります。

コントローラスペックとリクエストスペック
expect(response).to be_successexpect(response).to be_successfulに変更する
リクエストスペック
expect(response).to have_http_status(:success)expect(response).to be_successfulに変更する

具体的な変更点については、こちらのdiff(差分)も参考にしてください。

https://github.com/everydayrails/everydayrails-rspec-2017/compare/master...JunichiIto:rails-5-2

システムスペックについて

rspec-rails 3.7ではフィーチャスペックの代わりにシステムスペックというタイプのテストを書くことができます(ただし、システムスペックを使う場合はRails 5.1以上が必要)。
システムスペックの説明やフィーチャスペックからシステムスペックに移行する方法を知りたい場合は、以下のブログ記事を参照してください。


サンプルアプリケーションはRuby 2.4、またはDevise 4.4以上で動かしてください

本書のサンプルアプリケーションは以下のリポジトリで公開されています。

ただし、2018年7月時点のmasterブランチのテストコードをRuby 2.5で動かそうとすると、以下のようなエラーが発生します。

Failures:

  1) Sign in user signs in
     Failure/Error: click_link "Sign In"
     
     SyntaxError:
       /Users/jnito/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/devise-4.3.0/app/controllers/devise/sessions_controller.rb:5: syntax error, unexpected '{', expecting keyword_end
       ...ion only: [:create, :destroy] { request.env["devise.skip_tim...
       ...                              ^
       /Users/jnito/.rbenv/versions/2.5.1/lib/ruby/gems/2.5.0/gems/devise-4.3.0/app/controllers/devise/sessions_controller.rb:5: syntax error, unexpected '}', expecting keyword_end
       ..."devise.skip_timeout"] = true }
       ...                              ^
     # ./spec/features/sign_ins_spec.rb:12:in `block (2 levels) in <top (required)>'
     # -e:1:in `<main>'

Finished in 9.24 seconds (files took 3.78 seconds to load)
70 examples, 1 failure

Failed examples:

rspec ./spec/features/sign_ins_spec.rb:10 # Sign in user signs in

これはサンプルアプリケーションのDeviseのバージョンが古いのが原因です(参考)。

Ruby 2.5ではなく、2.4に落として実行すると、正常に動作します。
rbenvを使っている場合は以下のコマンドでRubyのバージョンを指定してください(以下の例ではRuby 2.4.4を指定していますが、2.4系であれば他のバージョンでも構いません)。

rbenv local 2.4.4

もしくは以下のコマンドでDeviseをアップデートすれば、Ruby 2.5でも動作します(Devise 4.4以上であればOKです)。

bundle update devise

まとめ

というわけで、このエントリでは2018年7月10日に実施した「Everyday Rails - RSpecによるRailsテスト入門」のアップデート内容について紹介しました。

すでに本書を持っている方はぜひ最新版をダウンロードしてください。

Everyday Rails - RSpecによるRailsテスト入門 | Leanpub
f:id:JunichiIto:20180219082935p:plain

「Everyday Railsって何?」「いったいどんな本?」と思われている方は以下のブログ記事をご覧ください😉