カテゴリー:
Rails
タグ:
 Rails watchr Rails4 Spring TDD

このエントリーをはてなブックマークに追加
更新日時:
2013年08月01日(木)
作成日時:
2013年08月01日(木)

前の記事 / 次の記事

基本的にはRspec+Spork+WatchrでTDDなRailsのテスト環境を構築するに書いたことと
同じなんだけど、Railsが4になったのと、SporkをSpringに置き換えたことで設定する項目が
大幅に減ったので、改めて書いてみる。

何でGuardじゃなくてWatchrなの?
っていうのは自動テストに使うだけならWatchrの方がシンプルで分かりやすいと思うのと、
相変わらず自分の環境ではGuardがいまいちうまく動かなかったから。

Rails4で自動テスト環境を整える~cucumber&rspec&guard&spring&factory_girl
にも書いてあるように、デフォルトのままだと同じspecが2回走るっていうのがあって、
"spec/spec_helper.rb" から "require 'rspec/autorun'" を削除すれば直るっぽいんだけど、
自分の環境では直らなかった。

(でもGuardが上手く動かないって記事見たことないから、もしかしたらそもそも自分の環境がバグってるのかな・・・)

環境

OS: CentOS6.3, Ruby: 2.0.0p03p286, Rails: 4.0.0, Rspec: 2.14.4, Spring: 0.0.10, Watchr: 0.7

やること

1.必要なgemのインストール
2.Rspecのセッティング
3.Springのセッティング
4.Watchrのセッティング
5.参考ページ

1.必要なgemのインストール

次のgemが必要

Gemfileに追加してインストール

$vi Gemfile
gem 'spring'
gem 'watchr',      group: :development
gem 'rspec-rails', group: [:development, :test]

$ bundle install

2.Rspecのセッティング

$ rails g rspec:install
create  .rspec
create  spec
create  spec/spec_helper.rb

この状態でRailsでモデルやコントローラーを作成した時に自動的にRspecのテストが
生成されるようになっているはずなので適当になにかつくってみる。

$ rails g scaffold user name:string
$ rake db:migrate
$ rspec spec/models/user_spec.rb

動いてるっぽかったら次へ。

3.Springのセッティング

Springが何者なのかというのは、Sporkのようなもの。
テストの度にプロセスを立ち上げるのではなく、一度立ちあがったプロセスを確保しておき、
そのプロセスを使ってテストを走らせることができる。という仕組み。

Sporkは基本的にテストの時にしか使えなかったけど、
Springはgenerateやrakeの実行時間も短縮できてかなりイケてる。

で、肝心のセッティングだけど、実は設定することは何もない。

spring上でrspecを走らせるには次のようにする。

$spring rspec

1度目はプロセスがロードされていないので、実行速度は普通に実行するのと変わらないが、
2回目以降は1回目にロードしたプロセスを再利用するので大幅に実行時間が短縮される。

4.Watchrのセッティング

やることはWatchr用のスクリプトを書くことと、
rakeタスクでそのスクリプトを起動出来るようにすること。

まずはWatchr用スクリプト。

specファイルが更新されたらそのspecファイルを、
app配下のファイルが更新されたらそのファイルに対応するspecを走らせる。

$ vi .watchr
def run_spec(file)
  unless File.exist?(file)
    puts "#{file} does not exist"
    return
  end

  puts "Running #{file}"
  system "bundle exec spring rspec #{file}"
  puts
end

watch("spec/.*/*_spec.rb") do |match|
  run_spec match[0]
end

watch("app/(.*/.*).rb") do |match|
  run_spec %{spec/#{match[1]}_spec.rb}
end

次にrakeタスク

$ vi lib/tasks/watchr.rake
desc "Run watchr"
task :watchr do
  sh %{bundle exec watchr .watchr}
end

試しに起動してみる

$ rake watchr
rake watchr .watchr
/home/appname/vendor/bundle/ruby/1.9.1/gems/watchr-0.7/lib/watchr.rb:111: \
Use RbConfig instead of obsolete and deprecated Config.

これでファイルを更新したタイミングで自動的にテストが走り

$ vi app/models/user.rb
:w

Watchrを動かしているコンソールに結果が表示されるはず。

Pending:
  User add some examples to (or delete) /home/appname/spec/models/user_spec.rb
    # No reason given
    # ./spec/models/user_spec.rb:4

Finished in 0.01407 seconds
1 example, 0 failures, 1 pending

Randomized with seed 61875

5.参考ページ