テストでメールを送信せずに、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
をスタブ化するのが確実でよい。
Pingback: CakePHP2 メール | 今きになった事