愛と勇気と缶ビール

ふしぎとぼくらはなにをしたらよいか

Perlでのmock(実はstub)とinline object

単体テストを単体テストたらしめんために(?)、stubとかmockを使ってテストの対象ならざるモジュールを脇によける、ということをよくやる。

僕は、PerlではTest::Mock::Guard、JSではSinon.JSのsinon.stubなどを使う。

mock対象の関数が本来オブジェクトを返す場合(例えばPlack::Requestを返す、とか)がままあるのだが、Perlでは最近はこうしている。

use Test::Mock::Guard qw/mock_guard/;
use Plack::Util;

my $mock = mock_guard(
    "Module::To::Be::Mocked" => +{
        sub_to_be_mocked => Plack::Util::inline_object(
            content => sub { encode_json(+{ foo => "bar" }); },
        ),
    },    
);

もっとエレガントな解がありそうだ。