RSpec/Spork/Guard/Growl/Rails 3.2.11で作る - プリチーなTDD環境! 


「ぷりちー」なRailsのTDD環境をオレオレ定義してみました!

* Guardをつかったファイル更新監視
* RSpec/Spork/LiveReload/Powが自動で動作
* Growlでテスト結果の通知をで行う(For Mac)

今回はこのTDD環境の構築手順を書いてみます。


🗻 Gemfileの更新

Gemfileに次の内容を追加して、bundle installを実行。

group :development do
# viewやcssの変更を監視してブラウザを自動的にリロードする
gem 'guard-livereload'
gem 'em-websocket'
end
group :test do
# HTTP requests用のモックアップを作ってくれる
gem 'webmock'
# 便利マッチャー集
gem "shoulda-matchers"
end
group :development, :test do
# ファイルの変更を監視してPowサーバを再起動
gem 'guard-pow'
# Rspec
gem 'rspec-rails'
# fixtureの代わり
gem "factory_girl_rails"
# テスト環境のテーブルをきれいにする
gem 'database_cleaner'
# 設定をロードしたサーバーによってテストを高速化
gem 'spork'
# ファイルの変更を検知する。OSX用
gem 'rb-fsevent'
# テスト結果をGrowlで通知する(Lion向け)
#gem 'growl'
# テスト結果を通知センターに表示する(Mountain Lion向け)
gem 'terminal-notifier-guard'
# ファイルの変更を監視してテストを自動化
gem 'guard-rspec'
# 設定ファイルの変更を監視してテストサーバーを再起動
gem 'guard-spork'
# Gemfileを監視して、変更があったら自動でbundle installを実行
gem 'guard-bundler'
# Railsコンソールの多機能版
gem 'pry-rails'
# pryの入力に色付け
gem 'pry-coolline'
# コードに"binding.remote_pry(rspec内ではbinding.pry_remote)" => pry-remoteでpryに入れます。
gem 'pry-remote'
gem "pry-debugger"
gem "pry-doc"
gem 'pry-stack_explorer'
# PryでのSQLの結果を綺麗に表示
gem 'hirb'
gem 'hirb-unicode'
# pryの色付けをしてくれる
gem 'awesome_print'
end

😸 application.rbの設定

config/application.rb内のclass Application < Rails::Application内に次の内容を追加。(設定は任意で変更してください)

# generatorの設定
config.generators do |g|
g.test_framework :rspec, :fixture => true
g.fixture_replacement :factory_girl, :dir => "spec/factories"
g.view_specs false
g.controller_specs false
g.helper_specs false
g.routing_specs false
g.request_specs false
end

🐡 config/environments/test.rbの設定

config/environments/test.rbに次の内容を追加。

AppName::Application.configure do
# Spork 使用時にクラスをキャッシュしないようにする
if defined?(Spork) && Spork.using_spork?
config.cache_classes = false
else
config.cache_classes = true
end
end

🗽 RSpecの設定

RailsへのRSpecのインストールとひな型を作成。

rails generate rspec:install

.RSpecにはRSpecコマンドの引数を記述できます。次のとおり編集。

(詳細はRSpec –helpを参照)

echo '--color --drb -f d' > .rspec

RSpecの設定ファイルspec/spec_helper.rbを次のように変更。

require 'rubygems'
require 'spork'
require "webmock/rspec"
WebMock.allow_net_connect!
#uncomment the following line to use spork with the debugger
#require 'spork/ext/ruby-debug'
Spork.prefork do
# Loading more in this block will cause your tests to run faster. However,
# if you change any configuration or code from libraries loaded here, you'll
# need to restart spork for it take effect.
ENV["RAILS_ENV"] ||= 'test'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'rspec/autorun'
require 'shoulda-matchers'
# Requires supporting ruby files with custom matchers and macros, etc,
# in spec/support/ and its subdirectories.
Dir[Rails.root.join("spec/support/**/*.rb")].each {|f| require f}
RSpec.configure do |config|
config.infer_base_class_for_anonymous_controllers = false
config.use_transactional_fixtures = true
config.order = "random"
# FactoryGirlのメソッドをbuild, build_stubbed, create, attributes_forなどの省略形で書ける
config.include FactoryGirl::Syntax::Methods
# database_cleanerでテストのたびにDBをクリアする
require 'database_cleaner'
config.before(:suite) do
DatabaseCleaner.strategy = :truncation
DatabaseCleaner.clean_with(:truncation)
end
config.before(:each) do
DatabaseCleaner.start
end
config.after(:each) do
DatabaseCleaner.clean
end
end
end
# This code will be run each time you run your specs.
Spork.each_run do
# Spork利用時にapp配下/locale/routesをリロード
if Spork.using_spork?
Rails.application.reloaders.each{|reloader| reloader.execute_if_updated }
end
end

🎳 Pryの設定

config/environments/development.rbの中のYourAppName::Application.configureに以下を追加。

silence_warnings do
begin
require 'pry'
IRB = Pry
rescue LoadError
end
end

これで、rails cとした場合にpryが呼び出されます。

またコード内でデバッグを行いた場所にbinding.pry_remoteを追加した場合、処理が途中で停止します。そこでpry-remoteを打つとpry画面に入れます。
(guardで動いている場合は、binding.pryでguardから直接pryに進むっぽいです)

続いて、~/.pryrcに以下を追記。

# -*- coding: utf-8 -*-
# awesome_printの色付けの設定
require "awesome_print"
AwesomePrint.pry!
# pry-debuggerのショートカット
Pry.commands.alias_command 'c', 'continue'
Pry.commands.alias_command 's', 'step'
Pry.commands.alias_command 'n', 'next'
Pry.commands.alias_command 'f', 'finish'
# hirbの設定
begin
require 'hirb'
rescue LoadError
# Missing goodies, bummer
end
if defined? Hirb
# Slightly dirty hack to fully support in-session Hirb.disable/enable toggling
Hirb::View.instance_eval do
def enable_output_method
@output_method = true
@old_print = Pry.config.print
Pry.config.print = proc do |output, value|
Hirb::View.view_or_page_output(value) || @old_print.call(output, value)
end
end
def disable_output_method
Pry.config.print = @old_print
@output_method = nil
end
end
Hirb.enable
end

🍮 Sporkの設定

sporkの初期設定。

bundle exec spork --bootstrap

sporkのテスト。(起動が確認できたらCtrl + Cで停止させてください)

bundle exec spork
> Using RSpec
> Preloading Rails environment
> Loading Spork.prefork block...
> Spork is ready and listening on 8989! # ← 成功

🐠 Guardの設定

Guardfileの作成。

bundle exec guard init

Guardfileに次の項目を追加。

guard 'rspec' do
# rakeファイルの更新監視
watch(%r{^lib/(.+)\.rake$}) { |m| "spec/lib/#{m[1]}_rake_spec.rb" }
end
# 全体テストをしないようにする(全体テストは、guardが動いてる所でEnterすると実行)
# guard 'rspec' doを以下に書換え
guard 'rspec', :version => 2, :cli => "--drb", :all_after_pass => false, :all_on_start => false do

👽 LiveReloadの設定

ブラウザのリロード用アドオンを任意でインストール。

🎂 Growlの設定

ここはMacかつLionの方限定です。

Mountain Lionの方は、通知センターに送付します。(Gemfileを参照ください)

Growをインストール。

続いてGrowlNotifyのインストール。
Growl - Downloadsにてダウンロード/インストールする。

🎉 Guardの動作確認

guardの実行。

bundle exec guard

次のような結果が出ていれば成功です。

Guard uses Growl to send notifications.
Guard uses TerminalTitle to send notifications.
Guard is now watching at '/path/to/app/test-app/'
LiveReload 1.6 is waiting for a browser to connect.
Guard::RSpec is running
No examples found.

Finished in 0.00007 seconds
0 examples, 0 failures

🍣 関連記事: Rails 3.2.11/Bootstrap/Haml

Rails 3.2.11/Bootstrap/Haml プロジェクト新規作成 最短ガイドだよ! にRailsのモダンなプロジェクト作成の流れを書きました。Railsのプロジェクト作成から始めたい方はぜひ。

🤔 関連記事: テスト環境にseedデータを自動で読み込ませる

RSpecでテストをするときにseedデータをテスト環境のDBに読み込ませてテストをしたいということがあると思います。そんなときは、seed_fuというgemがやってくれます。以下が紹介記事です。

seed-fuで始める効率的なRails Seed管理

🐮 関連記事

開発サーバをThinからPowに切り替えて開発効率アップ! (Mac限定) にてPowに関する記事を載せました。Powインストールがまだの方はぜひ。

🚕 失敗談

Rails + Pow + pry/ruby-debug(Ruby 1.9.3) | カワイイはつくれるにトライしてみたんですが、
残念ながら僕の環境ではuninitialized constant PryStackExplorer::Pryだそうです。技術力つけて再チャレンジ!

🎃 参考リンク

🍄 変更来歴

12/03 23:50 FactoryGirl/database_cleanerの設定を見直し。Pryの設定追加

12/06 09:37 Gemfileの’awesome_print’が間違っていたので修正

12/07 21:04 Gemfileに’pry-coolline’を追加

12/11 12:55 FactoryGirlの設定に説明書きを追記

12/12 21:20 guard-Bundlerとterminal-notifier-guardをGemfileに追加

12/12 21:35 growlの説明書きを追加

12/16 17:30 binding.pryに関する説明を追記

12/18 20:30 environments/test.rbとrspec_helperの設定を追加

12/21 18:30 config/application.rbの設定を追加

12/30 18:05 spec_helper.rbのdatabase_cleanerの設定を見直し

12/31 13:05 gem Webmockを追加

01/02 08:45 gem Webmockの記述場所を修正

01/16 23:05 gem shoulda-matcherを追加

01/21 18:30 gem pry-debuggerを追加

01/22 14:15 gem pry関連のGemとその設定を追加

01/24 11:40 RSpecで全体テストをしないように設定を修正

04/14 21:40 guardをbundle exec guardに修正

🏈 テスト環境

テスト環境は以下のとおりです。

OS : Mac Mountain Lion(OS X 10.8)
Ruby : 1.9.3
Rails : 3.2.11
haml : 3.1.7
coffee-script : 3.2.1
Rspec : 2.12.0

📚 おすすめの書籍