ウェブサービスを作っています。

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


あとは、ファイルを修正するとテストが実行されます。
なかなか良さそうなので使ってみます。