spork の使い方メモ

どっかに書いたような気がしてたんだけど、どこに書いたか忘れたので再び(?)書く。

1.インストール

Rails で使用すること前提なので、Gemflie に

group :development, :test do
  gem 'spork', '~> 0.9.0.rc'
end

などと書く。rc を付けないと、0.8系がインストールされる。Rails3で利用する場合には、0.9系をインストールする必要がある。

2.初期設定

  bundle install

してから、

  bundle exec spork --bootstrap

を実行

3.spec_helper 修正

spork --bootstrap を実行しても、何も起こらない。自分で spec/spec_helper.rb を修正しなければならない。じゃあ、spork --bootstrap の意味って何よ?
こんな風(spec_helper.rb)

Spork.prefork do
    # この辺に、rails generate rspec:install で作成された
    # spec_helper のコードを移動する

    # app/ 以下が更新されたらリロード
    ActiveSupport::Dependencies.clear
    ActiveRecord::Base.instantiate_observers
  end
end

Spork.each_run do
  # FactoryGirl の factories をリロード
  FactoryGirl.registry = FactoryGirl::Registry.new
  FactoryGirl.definition_file_paths.each do |path|
    load "#{path}.rb" if File.exists?("#{path}.rb")

    if File.directory?(path)
      Dir[File.join(path, '*.rb')].each do |file|
        load file
      end
    end
  end

  # routes.rb のリロード
  DemoApp::Application.reload_routes!

end

ついでに(config/application.rb)

module DemoApp
  class Application < Rails::Application
    # (略)
    # Configure sensitive parameters which will be filtered from the log file.
    config.filter_parameters += [:password]

    # for the prefork hack
    if Rails.env.test? && defined?(Spork) && Spork.using_spork?
      initializer :after => :initialize_dependency_mechanism do 
        ActiveSupport::Dependencies.mechanism = :load
      end
    end
  end
end

メソッド名からわかるように、Spork.prefork は spork を動かした最初の1回だけ実行される。Spork.each_run はテストが実行される前にいつも動く。
正直、prefork に何を書くべきかはよくわかっていない。ActiveSupport::Dependencies.clear から始まる 2行は Curiosity PDF - からパクッてきました。
FactoryGirl の初期化も 2.0系になると方法が変わっているようなので、上記で正しく動いてるかは自信ない。

4.使用

新たに terminal を立ちあげて、プロジェクトのルートで

spork

とすると、spork サーバーが動くので

rspec --drb spec 

とすることで、あらかじめ動かした spork サーバー側でテストが実行されます。
毎回 --drb するのは面倒なので、.rspec ファイルを修正して

--colour
--drb

などとしておきましょう。