Rails 4 時代のアプリケーション作成日誌

はじめに

Rails 3 の時代にかなり頑張ってシステム構築をしていましたが、Rails 4 になりかなり環境もかわりつつあるようです。日々学習していないと取り残されていきますので、自分でアプリを作りながら環境構築をして見たいと思います。取り急ぎ、まずは現状調査を行ってみたのでまとめてみます。

現状調査

Rails 本体

現在の最新は 4.0.2 です。4.0.0 の時にはデイジーチェーンオーダーが入れ替わったりとゴタゴタしたこともありましたが、4.0.1 で大量のバグフィックスがなされたため、現在は落ち着いておりかなり使いやすくなっていると思います。もっとも大きい変更は strong_parameters の導入だと思います。Rails 3 まではモデル側で代入可能な属性を制御していましたが、Rails 4 ではコントローラ側で制御するようになりました。例えば、create (新規作成) 時にはある属性の設定は許可しないが、update(更新)時にはある属性の編集を許可するような厳密な制御が可能となります。
また、コントローラの前処理、後処理時に別処理を行う *_filter が *_action に変わっています。今までは処理前に認証を挟むような before_filter の処理くらいにしか使っていませんでしたが、scoffold で生成される雛形を見ると、show、edit、update は必ず id のオブジェクトを取得する必要があるため、before_action で一ヶ所にまとめられています。jsonjbuilder で出力されるようになったため、show、edit は何もしないメソッドに、update は更新処理のみしか書いてありません。DRY が徹底されていますね。

Rspec

私が使い始めた頃はかなり少数派で、使っている人もあまり多くなかった感がありますが、すっかりメジャーになっていますね。今は 2.14.7 ですが、もうすぐRSpec 3 になろうとしているところのようです。
RSpec のもっとも大きな変更はやはり、should がなくなる方向にあることでしょう。今までは、

  @book.title.should == "Book title"

という形で書いていましたが、

  except(@book.title).to eq("Book title")

のようになります。詳しくは「RSpec 3に向けての計画(日本語訳)」を参照してください。

Guard

以前は、ZenTest に入っている autotest を使っていました。.autotest をちゃんと書けば該当するファイルだけを監視して自動テストしてくれました。最近はほとんど Guard の記事しか見ませんので、Guard に移行したいと思います。設定は、

bundle exec guard init rspec

とするだけで、自動的に Guardfile を作成してくれます。ただし、後述する spring と連携するにはちょっと一手間必要なようです。実際に記述する際に説明します。

Spring

Ruby 1.9 になってから、require 時のプリコンパイルが入るため、ファイルを大量に読み込む Rails ではテストの起動時間が非常に問題になっていました。これまでは、Spork という application preloader を使っていましたが、自動読み込み機能がなかったために、watchr という別のファイル監視ツールを利用して、Spork の再起動を行っていました。

Spork/Zeus/Spring によるテスト実行時間の短縮」によると、設定が簡単なため Spring が流行っているようです。特に spring の場合、rspec だけでなく、rake などの時間も高速化するようです。Spork と異なり、自動読み込み機能があるため、watchr を別途用意する必要はありません。

Spring を使う上での注意ですが、bundle の元でインストールすると高速化のメリットがないために、gem でインストールしなければならないようです(「Rails4時代の高速テスト環境 Rspec+Guard+FactoryGirl+Spring」を参照)。Spring の githubを調べたら、この記述がなくなっていました。今は Gemfile に書いてもいいようです。また、このページのコメントにあるように、前述の Guard から呼び出す場合には以下のように書く必要があるようです(spring オプションは非推奨になったとのこと)。

guard :rspec, cmd: 'spring rspec -f doc' do

また、この時 Spring から rspec を呼ぶのが別 gem になったために、spring-commands-rspec の gem をインストールするとのことです。また、別 gem になってしまったために、guard から呼び出すのはちょっと面倒になり、「最近(2013/11/18)のspring(Railsのコマンドを高速化する方)について」に書いてあるように、.spring.rb を用意する必要があるようです。

なによりも、spring というと、J2EE のこちらの方が有名なので、情報を取得するのが面倒ですね。

Turnip

以前は、受入テストに Cucumber を使っていました。ブラウザの挙動を模倣する Webrat というシステムを経由して、エンドツーエンドテストを自動化するものです。ただし、Rspec とは別のアプリケーションとなるので、Rspec による単体テストとは別に Cucumber アプリを起動するという形になっており、なかなか面倒なものでした。

やはりテストは Rspec 上で行いたいということで、後述する Capybara 開発者が作成したものが Turnip です。Rspec 内に Cucumber と同じ feature ファイルが記述できるそうです。まだ試していないのでまた詳細はまた後日。

Capybara

先ほど説明した Webrat の後継となるシステムが Capybara です。Webrat と異なり、Javascript もテストできるようです。これも詳細は後日にしたいと思います。

SimpleCov

以前は、rcov を使っていましたが、Ruby 1.9 では正しい結果がでないということで、現在は SimpleCov を使うのが通常のようです。

FactoryGirl

以前は、fixtures で頑張ってテストに合いそうな初期データを作っていましたが、FactroyGirl が普通に使われているようです。Fabrication というものもあるようで、シンタックスが綺麗だということで進めている人が多いようです。ただ、FactoryGirl の方が記事が多いようなのでこちらに寄せてみます。

おわりに

Fabrication の記事を検索していて「living as a gem ソムリエ」という記事にあたりました。記事の中に「一度導入すると変更が難しい gem」とありますが、今回のように思い立たないと新しい環境に入れ換えようという気分にはならないものです。いろいろと壁にぶつかりながらも、自分なりの環境を構築してみたいと思います。

written by iHatenaSync