$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

Test::Mock::Guardを使ってみた

  Test::Mock::Guard Released - Yet Another Hackadelicを見てちょっと使ってみたのでメモ。

最初はこんな感じの使い方をしてた。

package test::Sample;
use strict;
use warnings;

use Path::Class;
use lib file(__FILE__)->dir->parent->subdir('lib')->stringify;

use base qw(Test::Class);

use Test::Mock::Guard qw(mock_guard);

use Sample;
use Sample::Response::Mock;

mock_guard('Sample', +{
    _post => sub {
        my $self = shift;
        my ($url, $query) = @_;
        Sample::Response::Mock->new($query);
    },
});

sub _hoge_hoge : Test(1) {
    ...
}

__PACKAGE__->runtests;

1;

 でもうまくいかない、なんで?って思ってソース見たら、あるブロック内でのみMockするようにDESTROYを利用しているので、mock_guardの返り値をちゃんと変数にいれとかないといけなかった。

package test::Sample;
use strict;
use warnings;

use Path::Class;
use lib file(__FILE__)->dir->parent->subdir('lib')->stringify;

use base qw(Test::Class);

use Test::Mock::Guard qw(mock_guard);

use Sample;
use Sample::Response::Mock;

my $mock_guard = mock_guard('Sample', +{
    _post => sub {
        my $self = shift;
        my ($url, $query) = @_;
        Sample::Response::Mock->new($query);
    },
});

sub _hoge_hoge : Test(1) {
    ...
}

__PACKAGE__->runtests;

1;

って感じで書いたらうまくいきました。SYNOPSISでmock_guardの返り値を変数に入れてた意味がわかりましたってだけでした。終わり。