Verwenden von wp_mail während eines Integrationstests

Ich arbeite an einigen Tests für WordPress, und ich entdeckte, dass WordPress PHPUnit automatisch erfasst und keine E-Mails (mit MockPHPMailer ) MockPHPMailer wenn ich versuche, wp_mail zu verwenden.

Ich habe MockPHPMailer , aber ich kann anscheinend keine Informationen über MockPHPMailer . Ich würde gerne wissen, wie man es benutzt oder es deaktiviert (seit vor dieser Entdeckung hatte ich geplant, Mailtrap zu verwenden). Weiß jemand, wo ich Informationen über MockPHPMailer finden könnte?

Solutions Collecting From Web of "Verwenden von wp_mail während eines Integrationstests"

Ich arbeitete gerade an einigen Tests für Code, der wp_mail() gerade neu beinhaltete. Ich konnte auch keine Dokumente finden, aber ich mock-mailer.php einen Blick auf die Quelle von mock-mailer.php , und alles war ziemlich einfach.

Zuerst sollten Sie verstehen, dass WordPress immer den $phpmailer global verwendet, um eine Instanz des PHPMailer Objekts zu halten, das von wp_mail() . Während der Tests wird $phpmailer global automatisch auf eine Instanz von MockPHPMailer .

Der MockPHPMailer sendet keine E-Mails, sondern sammelt lediglich Informationen über jede Nachricht, die “gesendet” wird. Um diese Informationen abzurufen, können Sie die Methode get_sent() des Objekts get_sent() . Um das Objekt selbst abzurufen, sieht es so aus, als ob tests_retrieve_phpmailer_instance() verwendet werden soll.

In einem einfachen Test, in dem Sie nur überprüfen möchten, dass keine E-Mail gesendet wurde, würden Sie Folgendes tun:

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

Natürlich können Sie auch komplexere Prüfungen wie diese durchführen (ein echtes Beispiel aus meinen eigenen Tests):

  $email = tests_retrieve_phpmailer_instance()->get_sent(); $this->assertEquals( array( array( 'test@example.com', '' ) ), $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 ); 

Das von get_sent() E-Mail-Objekt hat die folgenden Eigenschaften :

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

Wenn Sie erwarten, dass mehrere E-Mails in einem einzigen Test gesendet werden, können Sie den zweiten mit get_set( 1 ) , den dritten mit get_sent( 2 ) usw. (sie werden in einem 0-indizierten Array gespeichert).

Wenn Sie den Mailer zurücksetzen und die erfassten Nachrichten mitten in einem Test vercasting möchten, können Sie reset_phpmailer_instance() (ab WordPress 4.6) aufrufen. Sie möchten dies auch nach jedem Test tun, indem Sie eine tearDown() Methode wie diese in Ihrer Testfall-class implementieren:

 public function tearDown() { parent::tearDown(); reset_phpmailer_instance(); } 

Und schließlich, wenn Sie die ursprüngliche PHPMailer Instanz in Ihren Tests anstelle des unset( $GLOBALS['phpmailer'] ) , versuchen Sie unset( $GLOBALS['phpmailer'] ) .