酒と泪とRubyとRailsと

Ruby on Rails と Objective-C は酒の肴です!

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

Where?

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

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

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


Gemfileの更新

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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内に以下の内容を追加。(設定は任意で変更してください)

1
2
3
4
5
6
7
8
9
10
# 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に以下の内容を追加。

1
2
3
4
5
6
7
8
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のインストールと雛形を作成。

1
rails generate rspec:install

.rspecにはrspec コマンドの引数を記述できます。以下のとおり編集。
(詳細は rspec –helpを参照)

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
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に以下を追加。

1
2
3
4
5
6
7
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に以下を追記。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# -*- 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の初期設定。

1
bundle exec spork --bootstrap

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

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

Guardの設定

Guardfileの作成。

1
bundle exec guard init

Guardfileに以下の項目を追加。

1
2
3
4
5
6
7
8
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をインストール。

fpu_tmp_1354148705.382_da97cc

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

fpu_tmp_1354148550.4162_b194f0

Guardの動作確認

guardの実行。

1
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 だそうです。技術力つけて再チャレンジ!

Special Thanks

変更来歴

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

おすすめの書籍