it-swarm-ja.com

統合テスト中にwp_mailを使用する

私はWordPressのテストに取り組んでいますが、wp_mailを使おうとするとWordPressのPHPUnitが(MockPHPMailerを使って)自動的にメールをキャプチャして送信しないことを発見しました。

私は見ましたが、私はMockPHPMailerに関する情報を見つけることができないようです。私はそれを使うか無効にするかのどちらかを知りたいのです(この発見の前からMailtrapを使うことを計画していたので)。誰が私がどこでMockPHPMailerについての情報を見つけることができるかを知っていますか?

3
Pete

先日、wp_mail()を含むコードのテストをいくつか行っていました。私はそれについてのドキュメントも見つけることができませんでした、しかし私は mock-mailer.php のソースを見ました、そしてすべてはかなり単純でした。

まず、WordPressはwp_mail()によって使用されるPHPMailerオブジェクトのインスタンスを保持するために常に$phpmailerグローバルを使用することを理解してください。テスト中、$phpmailerグローバルは自動的に 代わりにMockPHPMailer のインスタンスに設定されます。

MockPHPMailerは実際にはメールを送信するのではなく、単に「送信された」各メッセージに関する情報を収集するだけです。この情報を取得するために、オブジェクトのget_sent()メソッドを呼び出すことができます。オブジェクト自体を取得するためには、tests_retrieve_phpmailer_instance()が使われることを意図しているように見えます。

したがって、メールが送信されていないことを確認するだけの簡単なテストでは、次のようにします。

    $this->assertEmpty( tests_retrieve_phpmailer_instance()->get_sent() );

もちろん、このようにもっと複雑なチェックを実行することもできます(私自身のテストによる実際の例)。

    $email = tests_retrieve_phpmailer_instance()->get_sent();

    $this->assertEquals( array( array( '[email protected]', '' ) ), $email->to );

    $this->assertStringMatchesFormat( '%sItem 03%s', $email->body );
    $this->assertStringMatchesFormat( '%sA Donor%s', $email->body );
    $this->assertStringMatchesFormat(
        '%s' . get_the_title( $wish_list_id ) . '%s'
        , $email->body
    );

get_sent()によって返されるemailオブジェクトは 以下のプロパティを持ちます

  • to
  • cc
  • bcc
  • header
  • subject
  • body

1回のテストで複数の電子メールが送信されることが予想される場合は、2番目の電子メールをget_sent( 1 )、3番目の電子メールをget_sent( 2 )のように検索できます(0インデックスの配列に格納されます)。

テストの途中でメーラをリセットしてキャプチャしたメッセージを破棄したい場合は、(WordPress 4.6以降)reset_phpmailer_instance()を呼び出すことができます。テストケースクラスに次のようなtearDown()メソッドを実装することで、各テストの後にこれを行うこともできます。

public function tearDown() {

    parent::tearDown();

    reset_phpmailer_instance();
}

そして最後に、あなたのテストでモックメーラの代わりにオリジナルのPHPMailerインスタンスを使いたい場合は、unset( $GLOBALS['phpmailer'] )を呼び出してみてください。

5
J.D.