Continue(s)

Twitter:@dn0t_ GitHub:@ogrew

Test::Mock::Guard ~テスト用にお手軽にstub化~

今日も今日とて、これまでなんとなくで使ってたモジュールを再度見つめ直す回です。

github.com

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

無駄にネストが深くならずに済む。

よく聞くスタブとモックの違いについて。

厳密に正しいかはあれですが、この記事が参考になりました。

perl-users.jp

スタブの場合は、それを利用する部分がテスト対象になります。

( 中略)

一方、モックの場合は、適用する部分そのものがテスト対象です。

( 中略)

ですので、今テストしたい部分がどこかを的確に認識できれば、 モックとスタブのどちらを使うのがよい状況なのかを判断できるようになります。

ちなみに最近よく聞く?Test2にもメソッドをモックしてくれる君としてTest2::Mockというのがあるみたいなんですがこいつだとモックしたメソッドを何回呼ばれたかを知るcall_count同等の機能がない様子。

techblog.kayac.com

Test2についてはまた記事を書きたいと思います。

参考記事

mihyaeru21.hatenablog.com

blog.yuuk.io

d.hatena.ne.jp