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
などとしておきましょう。