Rails
RSpec
Guard
FactoryGirl
spring

Rails4時代の高速テスト環境 Rspec+Guard+FactoryGirl+Spring[NEW!]

More than 5 years have passed since last update.

Railsのテスト環境の定番といえば

  • Rspec
  • Guard
  • FactoryGirl
  • Spork

このへんの組み合わせが定番だったんではないでしょうか。
Sporkでテスト環境をプリロードして、Guardでファイルを監視してガンガンテストを回してと。

今回はこのSporkを最近メキメキと頭角を現してきているSpringに置き換えて
よりモダンな高速テスト環境の作り方を説明します。

Springのいいところ

このSpringなにがいいって、設定がすごく簡単。
おまけにGuard+Rspec以外にもrails generateやrake routesなど他のコマンドも高速化してくれます。

一度体験したらもう戻れません。

必要なGem

  • rspec-rails
  • guard-rspec
  • factory_girl_rails
  • spring
Gemfile
group :development, :test do
  gem 'rspec-rails'
  gem 'guard-rspec'
  gem 'factory_girl_rails'
  gem 'spring' # これを新しく追加
end

spec_helperの設定

基本的にいつもどおり。

FactoryGirlを使用する場合は、この記述がないとfactoryの変更が反映されません。

spec_helper.rb
config.before(:all) do
  FactoryGirl.reload
end

参考までに全文掲載。

spec_helper.rb
require File.expand_path('../../config/environment', __FILE__)
require 'rspec/rails'
require 'rspec/autorun'
require 'factory_girl'

Dir[Rails.root.join('spec/support/**/*.rb')].each { |f| require f }

ActiveRecord::Migration.check_pending! if defined?(ActiveRecord::Migration)

RSpec.configure do |config|
  config.use_transactional_fixtures = true
  config.infer_base_class_for_anonymous_controllers = false
  config.order = 'random'
  config.include FactoryGirl::Syntax::Methods

  config.before(:all) do
    FactoryGirl.reload # これがないとfactoryの変更が反映されません
  end
end

Guardの設定

これもほとんど今まで通りでOKです。
変更箇所は、下の一行目のspring: trueの部分だけ。

Guardfile
guard :rspec, spring: true do
  watch(%r{^spec/.+_spec\.rb$})
  watch(%r{^lib/(.+)\.rb$})     { |m| "spec/lib/#{m[1]}_spec.rb" }
  watch('spec/spec_helper.rb')  { 'spec' }

  watch(%r{^app/(.+)\.rb$})                           { |m| "spec/#{m[1]}_spec.rb" }
  watch(%r{^app/(.*)(\.erb|\.haml)$})                 { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
  watch(%r{^spec/factories/(.+)\.rb$})                { 'spec/factories_spec.rb' }
  watch(%r{^spec/support/(.+)\.rb$})                  { 'spec' }
  watch('config/routes.rb')                           { 'spec/routing' }
  watch('app/controllers/application_controller.rb')  { 'spec/controllers' }
end

それでは実行

bundle exec guard

よきテストライフを!

おまけ

途中で触れたように、このへんのコマンドも高速に実行できます。

bundle exec spring rails g model Hoge
bundle exec spring rake routes

さらにおまけ

Rails4っぽくbinstubつくっておくと、より便利

bundle binstub spring
./bin/spring xxx

弊社ブログ記事からの転載です
Rails4時代の高速テスト環境 Rspec+Guard+FactoryGirl+Spring[NEW!] @ heathrow.lab