単体テストを単体テストたらしめんために(?)、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" }); }, ), }, );
もっとエレガントな解がありそうだ。