Rails2系でGuard,Sporkを使ったBDDの自動実行環境を作る

Rails2系ではautospecを使ってやっていたけどGuardとSporkを使ったほうがいい気がしたので。

Install

インストールする必要のある物、及びバージョンは下記サイトを参考に

  • rspec 1.3.2
  • rspec-rails 1.3.4
  • factory_girl 1.2.4
  • spork 0.8.4
  • guard-rspec -v 0.7.0
    • guard
    • ffi
  • test-unit 1.2.3
  • guard-spork 0.6.1(バージョン指定特にしてない)


辺りを入れる。(子リストの奴は依存関係でインストールされるもの)

Setup

下記コマンドは基本的にRails.rootで行うものとする。(例外的な場合は記載

RSpec
$ ruby script/generate rspec
Spork
$ spork rspec --bootstrap

spec/spec_helper.rbを編集してあげる。diff貼ると差分多すぎるので説明だけ。

Spork.prefork do
  # ここに元々のspec_helper.rbの内容を書く
end
Guard
$ guard init spork
$ guard init rspec

Guardfileが生成されている筈である。

RSpec1系を使っているので書き換える

diff --git a/Guardfile b/Guardfile
@@ -13,7 +13,7 @@ guard 'spork', :cucumber_env => { 'RAILS_ENV' => 'test' }, :rspec_env => { 'RAIL
   watch(%r{features/support/}) { :cucumber }
 end

-guard 'rspec', :version => 2 do
+guard 'rspec', :version => 1 do
   watch(%r{^spec/.+_spec\.rb$})
   watch(%r{^lib/(.+)\.rb$})     { |m| "spec/lib/#{m[1]}_spec.rb" }
   watch('spec/spec_helper.rb')  { "spec" }


起動してみよう。

$ guard start

こんな感じのエラーがでた

ERROR: Could not start Spork server for RSpec, Test::Unit after 30 seconds. I will continue waiting for a further 60 seconds.

Test::Unit用のSpork設定は作ってないからエラー出ているのかなと思ったのでGuardfileを書き換える

diff --git a/Guardfile b/Guardfile
index df0b4ce..31697da 100644
--- a/Guardfile
+++ b/Guardfile
@@ -1,7 +1,7 @@
 # A sample Guardfile
 # More info at https://github.com/guard/guard#readme

-guard 'spork', :cucumber_env => { 'RAILS_ENV' => 'test' }, :rspec_env => { 'RAILS_ENV' => 'test' } do
+guard 'spork', :cucumber_env => { 'RAILS_ENV' => 'test' }, :rspec_env => { 'RAILS_ENV' => 'test' }, :test_unit => false do
   watch('config/application.rb')
   watch('config/environment.rb')
   watch(%r{^config/environments/.+\.rb$})

これで起動に成功した。別ウィンドウでspecファイルを更新してみると自動でテストが走り。


今回cucumberとbundlerは使わないので一応falseにしておく。

diff --git a/Guardfile b/Guardfile
index df0b4ce..709cfeb 100644
--- a/Guardfile
+++ b/Guardfile
@@ -1,7 +1,7 @@
 # A sample Guardfile
 # More info at https://github.com/guard/guard#readme

-guard 'spork', :cucumber_env => { 'RAILS_ENV' => 'test' }, :rspec_env => { 'RAILS_ENV' => 'test' } do
+guard 'spork', :rspec_env => { 'RAILS_ENV' => 'test' }, :test_unit => false, :cucumber => false, :bundler => false do
   watch('config/application.rb')
   watch('config/environment.rb')
   watch(%r{^config/environments/.+\.rb$})

RSpecの出力に色がついてないからという浅はかな理由でspec/spec.optsを読んでくれていないみたいと判断して
コマンドラインオプションを足す。そしてGuardfileは最終的にこうなった

diff --git a/Guardfile b/Guardfile
index df0b4ce..db3fe6d 100644
--- a/Guardfile
+++ b/Guardfile
@@ -1,7 +1,7 @@
 # A sample Guardfile
 # More info at https://github.com/guard/guard#readme

-guard 'spork', :cucumber_env => { 'RAILS_ENV' => 'test' }, :rspec_env => { 'RAILS_ENV' => 'test' } do
+guard 'spork', :rspec_env => { 'RAILS_ENV' => 'test' }, :test_unit => false, :cucumber => false, :bundler => false do
   watch('config/application.rb')
   watch('config/environment.rb')
   watch(%r{^config/environments/.+\.rb$})
@@ -13,7 +13,7 @@ guard 'spork', :cucumber_env => { 'RAILS_ENV' => 'test' }, :rspec_env => { 'RAIL
   watch(%r{features/support/}) { :cucumber }
 end

-guard 'rspec', :version => 2 do
+guard 'rspec', :version => 1, :cli => "--color --drb" do
   watch(%r{^spec/.+_spec\.rb$})
   watch(%r{^lib/(.+)\.rb$})     { |m| "spec/lib/#{m[1]}_spec.rb" }
   watch('spec/spec_helper.rb')  { "spec" }

その他参考サイト