rspec, factory_girl, spork, guardによる自動テスト環境の構築

こちらの記事を参考に自分で自動テスト環境を構築した記録です。この記事はすごく参考になりました。感謝です。

Rails3+RSpec2+Spork+Guard(guard-rspec,guard-cucumber)で最速のBDD(振舞駆動開発)環境を作る - Curiocity Drives me

0.環境

# Gemfile

source 'http://rubygems.org'

gem 'rails'
gem 'rake', '0.8.7'
gem 'mysql2', '0.2.6'
gem 'haml-rails'
gem 'jquery-rails'
$ bundle install --path vendor/bundle

1.rpec-rails, factory_girl_railsのインストール

# Gemfile

source 'http://rubygems.org'

gem 'rails'
gem 'rake', '0.8.7'
gem 'mysql2', '0.2.6'
gem 'haml-rails'
gem 'jquery-rails'

group :development, :test do
  gem 'rspec-rails'
  gem 'factory_girl_rails'
end
$ bundle install --path vendor/bundle
$ rails g rspec:install

これでspec_helper.rbが作成される。rspecに関する設定はここで行う。

2.rspec-rails, factory_girl_railsの設定
2.1.Generatorの設定(修正しました!追記2をご覧ください。)

  • rails g」でspecファイルとファクトリファイルが生成されるように設定を変更する。
  • config.generatorsに渡されるブロック内で設定できる。
  • ファクトリファイルのパスをspec/support/factoriesにしてるのは、rspec_helper.rbがrspecにspec/support配下のファイルを読み込むように指定してあるから。
# config/application.rb

module Antibotch
  class Application < Rails::Application

    # ...

    # Configure sensitive parameters which will be filtered from the log file.
    config.filter_parameters += [:password]
    
    # Configure file type generated by 'rails generate'
    config.generators do |g|
      g.orm                 :active_record
      g.template_engine     :haml
      g.test_framework      :rspec, fixture: true, views: false
      g.fixture_replacement :factory_girl, dir: 'spec/support/factories'
    end
  end
end

2.2.spec_helper.rbの設定

# spec/spec_helper.rb

# This file is copied to spec/ when you run 'rails generate rspec:install'
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'factory_girl' # 追加

# ...

RSpec.configure do |config|
  # ...

  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
  # config.fixture_path = "#{::Rails.root}/spec/fixtures" # コメントアウト

  # ...
end

3.sporkのインストール

# Gemfile

source 'http://rubygems.org'

gem 'rails'
gem 'rake', '0.8.7'
gem 'mysql2', '0.2.6'
gem 'haml-rails'
gem 'jquery-rails'

group :development, :test do
  gem 'rspec-rails'
  gem 'factory_girl_rails'
  gem 'spork'
end
$ bundle install --path vendor/bundle
# .spec

--drb

# 以下、僕の好み
--colour
-format documentation

4.spec_helper.rbの設定

$ bundle exec spork --bootstrap

spec_helper.rbが自動的に編集されるので、以下のように編集しなおす。

# spec/spec_helper.rb

require 'rubygems'
require 'spork'

Spork.prefork do
  # 元のspec_helper.rbのコード
end

Spork.each_run do
end

5.guard-sporkのインストールと設定

# Gemfile

source 'http://rubygems.org'

gem 'rails'
gem 'rake', '0.8.7'
gem 'mysql2', '0.2.6'
gem 'haml-rails'
gem 'jquery-rails'

group :development, :test do
  gem 'rspec-rails'
  gem 'factory_girl_rails'
  gem 'spork'
  gem 'rb-fsevent'
  gem 'growl'
  gem 'guard-spork'
end

growl, growlnotifyはインストール済み。

$ bundle install --path vendor/bundle
$ bundle exec guard init spork

Guardfileが生成されるので、これを以下のように編集。編集しないとspork for rspecが起動しないエラーが起きる。

# Guardfile

# A sample Guardfile
# More info at https://github.com/guard/guard#readme

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

7.guard-rspecのインストールと設定

# Gemfile

source 'http://rubygems.org'

gem 'rails'
gem 'rake', '0.8.7'
gem 'mysql2', '0.2.6'
gem 'haml-rails'
gem 'jquery-rails'

group :development, :test do
  gem 'rspec-rails'
  gem 'factory_girl_rails'
  gem 'spork'
  gem 'rb-fsevent'
  gem 'growl'
  gem 'guard-spork'
  gem 'guard-rspec'
end
$ bundle install --path vendor/bundle
$ bundle exec guard init rspec

エラーが発生するが、気にしない。

8.完成!

$ bundle exec guard start

これで起動するはず。起動中はファイルが保存される度にテストが自動的に実行されて、growlで結果が通知されるようになる。

  • -

追記1:guard startでエラーが発生する場合

$ bundle exec guard start
Guard is now watching at '/Users/nkaneko/workspace/jmty-web-dev/jmty-web'
Starting Spork for RSpec
Using RSpec
Loading Spork.prefork block...
ERROR: Could not start Spork server for RSpec. Make sure you can use it manually first.
Spork is ready and listening on 8989!

上記のようなエラーが発生した場合、以下のようにGuardfileを修正するといいかも。

# Guardfile

# A sample Guardfile
# More info at https://github.com/guard/guard#readme

guard 'spork', :rspec_env => { 'RAILS_ENV' => 'test' }, :test_unit => false, :cucumber => false, :wait => 30 do
  watch('config/application.rb')
  watch('config/environment.rb')
  watch(%r{^config/environments/.+\.rb$})
  watch(%r{^config/initializers/.+\.rb$})
  watch('spec/spec_helper.rb')
end

:waitパラメータはデフォルトで20なのですが、これを少し増やすと直るかもしれません。
githubで開発者がアナウンスしてます。

https://github.com/guard/guard-spork

追記2:rspecのgeneratorの設定について
config/application.rbのgeneratorの設定を以下のように修正します。

config.generators do |g|
  # g.test_framework :rspec, fixture: true, views:false
  g.test_framework :rspec, fixture: true, view_specs: false
end

generatorのオプションは以下のように調べることができる。

$ rails g scaffold
Usage:
  rails generate scaffold NAME [field:type field:type] [options]

...

Rspec options:
  [--fixture]                   # Indicates when to generate fixture
                                # Default: true
  [--fixture-replacement=NAME]  # Fixture replacement to be invoked
                                # Default: factory_girl
  [--singleton]                 # Supply to create a singleton controller
  [--controller-specs]          # Generate controller specs
                                # Default: true
  [--view-specs]                # Generate view specs
                                # Default: true
  [--webrat]                    # Use webrat methods/matchers
  [--webrat-matchers]           # Use webrat methods/matchers (deprecated - use --webrat)
  [--helper-specs]              # Generate helper specs
                                # Default: true
  [--routing-specs]             # Generate routing specs
                                # Default: true
  [--integration-tool=NAME]     # Integration tool to be invoked
                                # Default: rspec

...

なので、view_specs, helper_specs, controller_specsなどとオプションを設定する。