[Ruby on Rails 3, Ruby on Rails 4] RSpec/Capybara: Gurad でテストを自動化する
つづき。
「Ruby on Rails チュートリアル」をさわってみます。
Guardはファイルシステムの変更を監視し、自動的にテストを実行する。
RSpec 以外にも、Test::Unit、Cucumber、minitestなど多くの環境向けの機能拡張がある。
Contents
Gemfile
group :development, :test do
gem 'sqlite3', '1.3.5'
gem 'rspec-rails', '2.11.0'
gem 'guard-rspec'
end
group :test do
gem 'capybara', '1.1.2'
gem 'rb-fsevent', :require => false
# gem 'growl'
gem 'terminal-notifier-guard'
end
rb-fsevent, growl, terminal-notifier-guard
Mac OS X 環境下の Guard 利用の前提条件としてインストールが必要。
Guard は、gem growl をインストールすることで、Growlの通知機能をがサポートされるが必須ではない。
下記のgemで、OS の通知センターを利用できるよう。
gem 'terminal-notifier-guard'
Growlは、後述のエラーでうまく動かなかったので、こちらを利用した。
Mac 以外の開発環境は、以下のgemを利用する。
# Test gems on Linux
group :test do
gem 'capybara', '1.1.2'
gem 'rb-inotify', '0.8.8'
gem 'libnotify', '0.5.9'
end
# Test gems on Windows
group :test do
gem 'capybara', '1.1.2'
gem 'rb-fchange', '0.0.5'
gem 'rb-notifu', '0.0.4'
gem 'win32console', '1.3.0'
end
インストールと初期化
% bundle install
% bundle exec guard init rspec
19:33:12 - INFO - Writing new Guardfile to /Users/****/projects/sample_app/Guardfile
19:33:12 - INFO - rspec guard added to Guardfile, feel free to edit it
Guard を起動する
% bundle exec guard
20:31:35 - INFO - DEPRECATION WARNING: The :version option is deprecated. Only RSpec 2 is now supported.
20:31:35 - INFO - Guard is using TerminalNotifier to send notifications.
20:31:35 - INFO - Guard is using TerminalTitle to send notifications.
20:31:35 - INFO - Guard::RSpec is running
20:31:35 - INFO - Running all specs
........
Finished in 0.34951 seconds
8 examples, 0 failures
Randomized with seed 60671
20:31:41 - INFO - Guard is now watching at '/Users/****
/projects/sample_app'
[1] guard(main)>
rspecが実行され、結果が通知センター機能で通知される。
そのままコンソールが表示される。
この状態で監視されているファイルを変更すると、rspecが走る。
たとえば、config/routes.rb を空にする。
20:42:20 - INFO - Running: spec/routing
/Users/****
/projects/sample_app/vendor/bundle/ruby/2.0.0/gems/rspec-core-2.11.1/lib/rspec/core/configuration.rb:780:in `load': cannot load such file -- /Users/****
/projects/sample_app/spec/routing (LoadError)
from /Users/****
/projects/sample_app/vendor/bundle/ruby/2.0.0/gems/rspec-core-2.11.1/lib/rspec/core/configuration.rb:780:in `block in load_spec_files'
from /Users/****
/projects/sample_app/vendor/bundle/ruby/2.0.0/gems/rspec-core-2.11.1/lib/rspec/core/configuration.rb:780:in `map'
from /Users/****
/projects/sample_app/vendor/bundle/ruby/2.0.0/gems/rspec-core-2.11.1/lib/rspec/core/configuration.rb:780:in `load_spec_files'
from /Users/****
/projects/sample_app/vendor/bundle/ruby/2.0.0/gems/rspec-core-2.11.1/lib/rspec/core/command_line.rb:22:in `run'
from /Users/****
/projects/sample_app/vendor/bundle/ruby/2.0.0/gems/rspec-core-2.11.1/lib/rspec/core/runner.rb:69:in `run'
from /Users/****
/projects/sample_app/vendor/bundle/ruby/2.0.0/gems/rspec-core-2.11.1/lib/rspec/core/runner.rb:8:in `block in autorun'
[1] guard(main)>
ファイルを修正して、コンソールを空リターンしてみた。
[1] guard(main)>
[1] guard(main)>
20:46:33 - INFO - Run all all
20:46:33 - INFO - Running all specs
........
Finished in 0.28373 seconds
8 examples, 0 failures
Randomized with seed 16876
[2] guard(main)>
quit で終了する。
Guardfile で設定を変更する
Guardfile を修正することで、振る舞いを変更することができます。
余分なテストの実行を抑える
失敗したテストが後にパスしたとき、他の余分なテストが実行されないようにする。
guard 'rspec', :version => 2, :all_after_pass => false do
watch コマンドを追加する
下記とのことだが、Guardfile をみると .erb や .haml もチェックされるようなので後で試す。
デフォルトのGuardfileでは一致するすべてのファイルはRubyファイルです。ビューファイルが変更されたときもspecを実行したいので、これに一致するwatchコマンドを新たに追加します。
watch(%r{^app/views/(.+)/}) { |m| "spec/requests/#{m[1]}_spec.rb" }
補遺
Growl通知がでるものの、Guard が強制終了するようなので調べるも、解決できなかったので、Growlをやめました。
Bad file descriptor (Errno::EBADF)
下記のような指定をすると
gem 'rb-fsevent', '0.9.1', :require => false
gem 'growl', '1.0.3'
このようなエラーが出たので、バージョン指定を外し、bundle update しました。
19:55:04 - INFO - Guard is now watching at '/Users/****/projects/sample_app'
/Users/****/projects/sample_app/vendor/bundle/ruby/2.0.0/gems/rb-fsevent-0.9.1/lib/rb-fsevent/fsevent.rb:40:in `select': Bad file descriptor (Errno::EBADF)
from /Users/****/projects/sample_app/vendor/bundle/ruby/2.0.0/gems/rb-fsevent-0.9.1/lib/rb-fsevent/fsevent.rb:40:in `run'
from /Users/****/projects/sample_app/vendor/bundle/ruby/2.0.0/gems/listen-0.7.3/lib/listen/adapters/darwin.rb:31:in `block in start'
Error sending notification with growl
Guard は機能するようになったものの、下記のGrowlエラーが解決できませんでした。
20:23:33 - ERROR - Error sending notification with growl: undefined method `silent=' for #<growl::Base:0x007f984b305f08>