WordPress
PHPUnit
WP_UnitTestCase

WordPressでメールの送信のユニットテスト

More than 1 year has passed since last update.

たとえば何らかのメールを送信する WordPress プラグインを開発する際に、WordPressの wp_mail() で意図した通りのメールが送信されているかどうかを、ユニットテストで確認するには以下のように tests_retrieve_phpmailer_instance() を使用する。

wp_mail() の後に tests_retrieve_phpmailer_instance() を実行するというのがなんだか謎だけど WordPress 本体でのユニットテストもそうなってるので間違いではないです。

class WP_Multibyte_Patch_Test extends WP_UnitTestCase
{
    /**
     * `wp_mail` should encode as expected
     */
    public function test_wp_mail_should_be_sent_as_iso_2022_jp()
    {
        $to = 'hello@example.com';
        $subject = "こんにちは";
        $message = "日本語のメール";

        wp_mail( $to, $subject, $message );

        // テスト用のインスンタンスを作成
        $mailer = tests_retrieve_phpmailer_instance();

        // 送信先メールの確認
        $this->assertSame( 'hello@example.com', $mailer->get_recipient( 'to' )->address );

        // wp-multibyte-patchが有効化されている場合 ISO-2022-JP でエンコードされている
        $this->assertSame(
            "=?ISO-2022-JP?B?GyRCJDMkcyRLJEEkTxsoQg==?=",
            $mailer->get_sent()->subject
        );

        $this->assertSame(
            "こんにちは",
            iconv_mime_decode( $mailer->get_sent()->subject, 0, 'UTF-8' )
        );

        $this->assertSame(
            "日本語のメール\n",
            mb_convert_encoding( $mailer->get_sent()->body, 'UTF-8', 'ISO-2022-JP' )
        );
    }
}