Rails, RSpec, Spork: モデルが自動でリロードされない場合の対処法

RSpec + Spork で Rails アプリケーションのテストを実行する際、モデルクラスを書き換えてもテスト結果が変わらないことがあります。

config/environents/test.rbconfig.cache_classes の値を true から false に変えれば、この症状はとりあえず治まります。

しかし、新たに小さなRailsアプリケーションを作って確かめたところ、config/environents/test.rb を書き換えなくてもうまく行く場合もあることが分かりました。

そこで、spork -d コマンドで状況を調べてみました。このコマンドを使えば、Spork.prefork ブロックでどのクラスがどのように require されたかが分かります。

すると、


require "#{File.dirname(__FILE__)}/blueprints.rb"

という行でモデルクラスたちが require されていました。Machinist や FactoryGirl のような Fixtures 代替ツールは、当然のことながら、モデルクラスを require します。その結果、モデルクラスが自動でリロードされなくなっていたのです。

問題の行を、


load "#{File.dirname(__FILE__)}/blueprints.rb"

と書き換えて、Spork.each_run ブロックに移動したら、config/environents/test.rb を書き換えなくても、モデルクラスが自動でリロードされるようになりました。