"うっかりオーバーライド" をテストする Test::NoOverride
しれっとクラス継承して、うっかりメソッドをオーバーライドしちゃうこと、ありますよね?
僕は、ありません。
というわけで書いてみた。
Test::NoOverride
【t/override.t】みたいな感じのテストで
use Test::NoOverride;
no_override('Some::Class');
上のように書くだけ。
Some::Class
が継承してるクラスのメソッドを、オーバーライドしてるとテストこけます。という目論見。(no_* っていう命名は嫌がられそうだけど逆を考えることはなさそうなのでそのまま付けた。)
明示的にオーバーライドしてる場合は、exclude
にメソッドを並べます。
no_override(
'Some::Class',
exclude => [qw/ method /], # methods which you override specifically.
);
継承ツリーの中の一部のモジュールだけバージョン上がってオーバライドまわりおかしくなるとかそういうのも検知できたりするかもしれない(そういう状況、なかなかまれだと思うけど)。
なお、いまのところシンプルな継承しか扱ってなくて、Moo とか Mouse とか Moose とかはどうなるっけというの見てない。あと、new
はデフォルト無視でいいかなとか思ってたりもする。というか、すでにこういうのありそうな気もする。
まあ、もうすぐ秋だしいいか。