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で開発者がアナウンスしてます。
追記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などとオプションを設定する。