以前.autotestに書いたままになっていたhookが、いつの間にやら効かなくなっていたので調べてみました。
原因は、
ZenTest-3.10.0/lib/autotest.rb
645 def self.add_hook(name, &block)
646 HOOKS[name] << block
647 end
のようにそれぞれのhookに複数のブロックを登録出来るようになっていて、実際に呼ばれるところでは
636 HOOKS[name].any? do |plugin|
637 plugin[self]
638 end
のようにいずれかのブロックがtrueを返すと以降のブロックは実行されないようになっていたことでした。
なるほどなるほど、と納得したところで問題が。
既存のAutotest::Screenでhookに追加されているブロックがすべてtrueを返している(というか、messageメソッドの返りがそうなる)ので、.autotestで追加してもすでにあるhookにはすべて無視されてしまうことになります。
これを防ぐにはadd_hookの前で
Autotest::HOOKS.delete(なんとか)
をやってやればいいのですが、いまAutotest::Screenにある:runというhookが廃止になっていて、:quit以外はすべて置き換えることになってしまったので、角谷さんのRSpec対応も取り込ませていただいてadd_hookのところをざっくりと書き換えてみました。興味がある方は以下にファイルをまるごと置いておきますので、お試しください。
[08-12 12:21 追記] バグを直して再アップしました。
[08-29 01:40 追記] Gistにアップしました。
しばらく使ってみて問題ないようなら調子に乗ってパッチを投げてみようかと思います。
また、Shouldaはキーとなる挙動がふつうのテストと同じなので、このままで使えます。
ちなみに、現時点(正確には3.9.3から)でも以前autotestが止まらない原因になっていた:interruptは削除されているので、.autotestでdeleteする必要はなくなってました。