2014/09/17

"うっかりオーバーライド" をテストする Test::NoOverride

しれっとクラス継承して、うっかりメソッドをオーバーライドしちゃうこと、ありますよね?

僕は、ありません。

というわけで書いてみた。

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 はデフォルト無視でいいかなとか思ってたりもする。というか、すでにこういうのありそうな気もする。

まあ、もうすぐ秋だしいいか。

サイト内検索