Furl の mock 書いた
きのう App::aki を書いていて、その中では LWP::UserAgent を使っているのですが本当は Furl を使いたかったりしました。ただ、Furl を使うと、テストを書くのによさげな mock が見つけられなくて、t::Util 的なのに mock 書くとか、fake server な Test::HTTP::Server::Simple とか Test::Fake::HTTPD でやりくりしようかなあとか思ったんですが、aki は aki でさっさとリリースしたかったのでいったん Furl はあきらめたりしました(実用上はいまのところどちらでも良いので)。
まあでも今後も Furl はいっぱい使うだろうし、mock したい場面はあるだろうなということで、書いてみました。
Test::Mock::Furl
以下のような感じです。
use Test::More;
use Test::Mock::Furl;
use Furl;
use Furl::Request;
$Mock_furl->mock(request => sub { Furl::Response->new } );
$Mock_furl_res->mock(message => sub { 'ok ok ok' } );
my $req = Furl::Request->new('GET' => 'http://example.com/');
my $furl = Furl->new;
my $res = $furl->request($req);
ok $res->is_success;
is $res->code, 200;
is $res->content, '';
is $res->message, 'ok ok ok';
done_testing;
コードは Test::Mock::LWP からほぼまんまコピーです。
もうちょっとデフォルトでよしなに振舞う感じにしていきたいのと、細かいとこ足りてないと思いますが、なんかこんなんで自分のやりたかったのは満たせそうなんですが、どうでしょうか。