prefetch-rspec + watchr
使ってみました。Rails3 用のようです。
spork を使っていた場合は、spec/spec_helper.rb の spork 関連処理を削除しておきます。
また .rspec に --drb オプションが書いてあると、prefetch-rspec がうまく動かないようです。
まずは Gemfile に prefetch-rspec と watchr を追加して bundle します。
... group :test do gem 'prefetch-rspec', '0.1.4' gem 'watchr', '0.7' ... end
% bundle
続いて watchr 用のファイルを作ります。今回は specs.watchr という名前で Rails.root に置きました。
ほとんど以下の記事のコードそのままです。
rspec2 using watchr instead of autotest – DIXIS
# adapted from http://github.com/rspec/rspec-rails/blob/master/specs.watchr # Run me with: # # $ watchr specs.watchr # -------------------------------------------------- # Convenience Methods # -------------------------------------------------- def all_spec_files Dir['spec/**/*_spec.rb'] end def run_spec_matching(thing_to_match) matches = all_spec_files.grep(/#{thing_to_match}/i) if matches.empty? puts "Sorry, thanks for playing, but there were no matches for #{thing_to_match}" else run matches.join(' ') end end def run(files_to_run) puts("Running: #{files_to_run}") system("bundle exec prspec #{files_to_run}") no_int_for_you end def run_all_specs run(all_spec_files.join(' ')) end # -------------------------------------------------- # Watchr Rules # -------------------------------------------------- watch('^spec/(.*)_spec\.rb') { |m| run_spec_matching(m[1]) } watch('^app/(.*)\.rb') { |m| run_spec_matching(m[1]) } watch('^app/(.*)\.haml') { |m| run_spec_matching(m[1]) } watch('^lib/(.*)\.rb') { |m| run_spec_matching(m[1]) } watch('^spec/spec_helper\.rb') { run_all_specs } watch('^spec/support/.*\.rb') { run_all_specs } # -------------------------------------------------- # Signal Handling # -------------------------------------------------- def no_int_for_you @sent_an_int = nil end Signal.trap 'INT' do if @sent_an_int then puts " A second INT? Ok, I get the message. Shutting down now." exit else puts " Did you just send me an INT? Ugh. I'll quit for real if you do it again." @sent_an_int = true Kernel.sleep 1.5 run_all_specs end end
prefetch-rspec 用に config/environments/tests.rb を修正します。
config.cache_classes = ENV.has_key?('PRSPEC') ? false : true
PRSPEC は、P + RSPEC の略ですね。(たぶん)
Rails.root で prspecd コマンドを実行します。
% be prspecd --rails
なお、alias be="bundle exec" を .zshrc で設定しています。
watchr を起動します。
% be watchr specs.watchr
あとは、ファイルを修正するとテストが実行されます。
なかなか良さそうなので使ってみます。