CakePHP 2.x メール送信内容のテストを行う

標準

テストでメールを送信せずに、CakeEmailでのレンダリング内容を取りたい場合は、

// モックを作成
$CakeEmail = $this->getMock('CakeEmail', array('transportClass'));
$CakeEmail->expects($this->any())->method('transportClass')
    ->will($this->returnValue(new DebugTransport()));
// CakeEmailのMockをセット
$TestTarget->CakeEmail = $CakeEmail;
// ... $TestTargetを使った何らかのメール送信を含む処理
// text形式のメッセージを取得
$bodyText = $CakeEmail->message(CakeEmail::MESSAGE_TEXT);
// html形式のメッセージを取得
$bodyHtml = $CakeEmail->message(CakeEmail::MESSAGE_HTML);
// ... 適宜、値チェック

てな感じで、CakeEmail::transportClass()をスタブ化してDebugTransportを返すようにする。で、CakeEmail::message()でbodyを取得する。

と、去年の7月に書いたメモがあったのでとりあえず公開。

追記:
CakeEmail::transport()でdebugを指定すればいいじゃないかとも思ったけど、テスト対象の何らかの処理の中でtransportを変更していたらアレなのでやっぱりtransportClassをスタブ化するのが確実でよい。

One Comment

  1. Pingback: CakePHP2 メール | 今きになった事

コメントを残す

Page optimized by WP Minify WordPress Plugin