Guard + SporkでDRbが使用するポートを指定する

Guardはファイルの更新を監視して決められたストラテジーを行うツール。

Sporkはコードをあらかじめ読み込んでおいてテストを高速化することを目的としたDRbサーバ。

GuardはContinuous Testing, つまり継続的なテストを行うためのツールとして、SporkはDistributed Testing, 分散テスト (実用の上ではnon-blockingで差分読み込みができる、くらいの理解でよい) のツールとして各々を単体で導入しても効果があるものの、「テストの高速化」という目的の下、組み合わせて使われることが多い。

これらを組み合わせるときはguard-sporkというgemをインストールするとGuardのジェネレータがかってにGuardfileを吐いてくれて便利。

デフォルトでは8989ポートを使うようになっている。これでだいたい問題ないのだけれども、デフォルトの設定で複数のSporkを走らせようとすると既存のポートでlistenしているDRbサーバに展開されたRubyオブジェクトを読みに行ってしまう。これでハマった。

RSpecのオプションに--drb-portがあって、これでRSpecが見にいくDRbサーバのポートを指定できる。

Guardで走らせるSporkサーバのポートを指定するにはguardメソッドにrspec_portというオプションを渡せばよい。

guard 'spork', rspec_env: { 'RAILS_ENV' => 'test' }, rspec_port: 9001 do
  # ...
end

Spork is ready and listening on 9001!といった出力がされていたらOK.