今日も今日とて、これまでなんとなくで使ってたモジュールを再度見つめ直す回です。
Test::Mock::Guardはテストで使えるモジュールとしてメジャーな模様。既存のクラス挙動を簡単にオーバーライドできる。
use strict; use warnings; use Test::More; use Test::Mock::Guard qw/ mock_guard /; package Discord; sub new { bless {} => shift; } sub solo { "長濱ねる"; } package main; { my $guard = mock_guard "Discord", +{ solo => sub { "平手友梨奈"; }, }; my $song0 = Discord->new; is $song0->solo, "平手友梨奈", "mock化されてる"; } print "------(OUT OF SCOPE)--------\n"; my $song = Discord->new; is $song->solo, "長濱ねる", "mock化されない"; done_testing;
〓 ~/perl_study ₍ ᕕ( ‘ω’)ᕗ⁾ $ prove -lvf discord.t discord.t .. ok 1 - mock化されてる ------(OUT OF SCOPE)-------- ok 2 - mock化されない 1..2 ok All tests successful. Files=1, Tests=2, 0 wallclock secs ( 0.02 usr 0.00 sys + 0.06 cusr 0.01 csys = 0.09 CPU) Result: PASS
無駄にネストが深くならずに済む。
よく聞くスタブとモックの違いについて。
厳密に正しいかはあれですが、この記事が参考になりました。
スタブの場合は、それを利用する部分がテスト対象になります。
( 中略)
一方、モックの場合は、適用する部分そのものがテスト対象です。
( 中略)
ですので、今テストしたい部分がどこかを的確に認識できれば、 モックとスタブのどちらを使うのがよい状況なのかを判断できるようになります。
ちなみに最近よく聞く?Test2にもメソッドをモックしてくれる君としてTest2::Mock
というのがあるみたいなんですがこいつだとモックしたメソッドを何回呼ばれたかを知るcall_count
同等の機能がない様子。
Test2についてはまた記事を書きたいと思います。