web-dev-qa-db-fra.com

Utilisation de wp_mail lors d'un test d'intégration

Je travaille sur quelques tests pour WordPress et j'ai découvert que le PHPUnit de WordPress capture automatiquement et n'envoie pas de courriels (avec MockPHPMailer) lorsque j'essaie d'utiliser wp_mail.

J'ai regardé, mais il semble que je ne trouve aucune information sur MockPHPMailer. J'aimerais savoir comment l'utiliser ou le désactiver (car avant cette découverte, j'avais prévu d'utiliser Mailtrap). Est-ce que quelqu'un sait où je pourrais trouver des informations sur MockPHPMailer?

3
Pete

Je travaillais sur des tests de code impliquant wp_mail() juste l'autre jour. Je ne trouvais pas non plus de documentation dessus, mais j’ai jeté un coup d’œil à la source de mock-mailer.php , et tout était plutôt simple.

Tout d’abord, vous devez comprendre que WordPress utilise toujours le $phpmailer global pour contenir une instance de l’objet PHPMailer utilisée par wp_mail(). Pendant les tests, le $phpmailer global est automatiquement défini pour être une instance de MockPHPMailer .

La MockPHPMailer n'envoie réellement aucun courrier, elle collecte simplement des informations sur chaque message "envoyé". Pour récupérer ces informations, vous pouvez appeler la méthode get_sent() de l'objet. Pour récupérer l'objet lui-même, il semble que tests_retrieve_phpmailer_instance() soit destiné à être utilisé.

Donc, dans un simple test où vous voulez juste vérifier qu'aucun courrier n'a été envoyé, vous feriez ceci:

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

Bien sûr, vous pouvez également effectuer des contrôles plus complexes comme celui-ci (un exemple réel tiré de mes propres tests):

    $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
    );

L'objet email renvoyé par get_sent() a les propriétés suivantes :

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

Si vous vous attendez à ce que plusieurs courriels soient envoyés dans un seul test, vous pouvez récupérer le deuxième avec get_sent( 1 ), le troisième avec get_sent( 2 ), etc. (ils sont stockés dans un tableau indexé à 0).

Si vous souhaitez réinitialiser le courrier et supprimer les messages capturés au milieu d'un test, vous pouvez appeler reset_phpmailer_instance() (à partir de WordPress 4.6). Vous voudrez également le faire après chaque test, en implémentant une méthode tearDown() comme celle-ci dans votre classe de testcase:

public function tearDown() {

    parent::tearDown();

    reset_phpmailer_instance();
}

Enfin, si vous souhaitez utiliser l’instance PHPMailer originale dans vos tests au lieu de l’imprimante fictive, essayez simplement d’appeler unset( $GLOBALS['phpmailer'] ).

5
J.D.