Autotest::Screenのhookを整理してみた。

以前.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する必要はなくなってました。

タイトルとURLをコピーしました