Email::Senderでのテスト

Email::Senderでメール送信しているアプリをテストするときは以下の様な感じで行う。

use Test::More;
use Encode;

# 環境変数を設定
BEGIN { $ENV{EMAIL_SENDER_TRANSPORT} = 'Test' }

use YourCode;
YourCode->run;

my @deliveries = Email::Sender::Simple->default_transport->deliveries;
for my $d ( @deliveries ) {
     my %headers = @{ $d->{email}->[0]->{header}->{headers} };
     my $body = $d->{email}->[0]->body;
     like(decode_utf8($body), qr/登録しました。/);
}

# default_transportをリセット
Email::Sender::Simple->reset_default_transport();

default_transportはクラス変数なので、何回もメール送信テストをするときは、リセットするようにする。