読者です 読者をやめる 読者になる 読者になる

初代Masteries

きっとモヒカンにもなれないお前たちに告げる!!!

Perlでテストをするときでもメソッドを上書きしたい!

...ということ, ありませんか?

自分の場合, 今朝Nephia::Setup::CartonというNephiaのflavorを作っていたのですが, これのテストを書いている時に「あっ, メソッド上書きしたいな〜」と思いました.

Nephiaのflavorは, flavor内部の「additional_methods」に登録されているメソッドをNephia::Setup::Baseに取り込んで実行することで, flavorによる拡張機能を実現しています*1.

Nephia::Setup::Cartonの場合, 「carton_install」というメソッドが追加され, これによってnephia-setupコマンドによる雛形生成時に, 自動的に「carton install」が実行されます.

で, このモジュールのテストでは, Nephia::Setup::BaseにflavorとしてNephia::Setup::Cartonを適用した上で, Nephia::Setup::Baseのcreateメソッドを叩いて雛形を生成して, その過程の標準出力を正常な場合と比較することでテストをしています.
...が, 内部で'carton install'を実行することになるので, 当然テストの時間はめちゃくちゃ長くなります.

この場合, 「Nephia::Setup::Baseで, Nephia::Setup::Cartonが提供するcarton_installメソッドが使えるかどうか」, 「Nephia::Setup::Baseのcreateメソッドが, このcarton_installメソッドを呼び出しているか」さえ確認できればいいので, carton_installメソッドを上書きして, 別の処理にしてあげればいいのでは? と考えました.

...というわけで, こうしてみた.

no strict 'refs';
no warnings 'redefine';
local *{'Nephia::Setup::Base::carton_install'} = sub { print "Installing modules using cpanfile" };
use strict;
use warnings;

黒魔術として名高い(?)型グロブとかを作って, なんかいい感じにいじくって, こんな感じでメソッドを上書きしてみました.

これで, 先ほど挙げた2点を確認できますし, 「carton install」コマンドを叩かずに済むので, 最小時間でテストを済ませることができます.

...という感じでブログに書いておけば,

コンテンツ力の高いテストおにいさんが, 「明日私のブログに来てください. 本当のメソッドの上書きをお見せしますよ.」って教えてくれそうなので書いてみました. 楽しみにしています.

*1:この辺り, 自分がp-r送って実装したんですが, 「additional_methods」は長いよなあ... という気がしています.