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
?
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'] )
.