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