Perl の Test2::V0 でオブジェクトの基底クラスを確認する ― 2020年12月18日 00時37分
こんにちは、nanto_vi です。この記事は Perl Advent Calendar の 18 日目です。
近年、Perl でテストの記述によく使われているモジュールが Test2::V0
です。Test2::V0
について詳しくは「第51回 Test2で変わるモダンなテスト―拡張性を持ったテスティングフレームワークとTest2::V0の使い方(1):Perl Hackers Hub|gihyo.jp … 技術評論社」を参照してください。
Test2::V0
を使い、あるオブジェクトがあるクラスのインスタンスであることを確かめたいときはどうすればよいでしょうか? 例えば、オブジェクトが URI
クラスのインスタンスであることを確かめようとして、次のように書くと……
# Bad
use Test2::V0;
use URI;
my $uri = URI->new('https://www.example.com/');
is $uri, object {
prop blessed => 'URI';
};
このテストは失敗します! prop blessed
の値 (Scalar::Util::blessed($uri)
の返り値) は URI::https
であり、URI
ではないからです。(URI::https
クラスは URI
クラスを継承しています。)
Test2::V0
0.000138 までは、次のように書く必要がありました。
# Good
is $uri, object {
call [ isa => 'URI' ] => T;
};
$uri->isa('URI')
の返り値が真ならよいというわけです。でもパッと見ただけでは何をやっているのかわかりづらいですよね。
Test2::V0
0.000139 (日本時間で 2020 年 12 月 16 日、つまりこれを書いている 2 日前のリリースです) では、次のように書けるようになりました!
# Good
is $uri, object {
prop isa => 'URI';
};
prop isa
を使うことで、オブジェクトの基底クラスの確認をわかりやすく書けます。また、check_isa
関数も追加されました。
これらの機能は Introduce object inehritance chekcs by nanto · Pull Request #230 · Test-More/Test2-Suite で導入されました。変更をレビューし取り込んでくださった Chad Granum 氏に感謝します。
コメント
トラックバック
このエントリのトラックバックURL: http://nanto.asablo.jp/blog/2020/12/18/9327857/tb
コメントをどうぞ
※メールアドレスとURLの入力は必須ではありません。 入力されたメールアドレスは記事に反映されず、ブログの管理者のみが参照できます。
※投稿には管理者が設定した質問に答える必要があります。