在集成测试期间使用wp_mail

时间:2016-10-05 作者:Pete

我正在为WordPress做一些测试,我发现WordPress的PHPUnit自动捕获并且不发送电子邮件(使用MockPHPMailer) 当我尝试使用wp_mail.

我看过了,但似乎找不到关于MockPHPMailer. 我很想知道如何使用或禁用它(因为在这个发现之前,我计划使用Mailtrap)。有人知道我在哪里可以找到关于MockPHPMailer?

1 个回复
最合适的回答,由SO网友:J.D. 整理而成

我正在为涉及的代码进行一些测试wp_mail() 就在前几天。我也找不到任何文档,但我看了一下the source of mock-mailer.php, 一切都很简单。

首先,您应该了解WordPress总是使用$phpmailer 用于保存的实例的全局PHPMailer 使用的对象wp_mail(). 在测试期间$phpmailer 全局自动set to be an instance of 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()the following properties:

  • to
  • cc
  • bcc
  • header
  • subject
  • bodyget_sent( 1 ), 第三个是get_sent( 2 ), 依此类推(它们存储在索引为0的数组中)。

    如果要在测试过程中重置邮件程序并丢弃捕获的邮件,可以调用reset_phpmailer_instance() (自WordPress 4.6起)。您还希望在每次测试后通过实现tearDown() 在testcase类中使用如下方法:

    public function tearDown() {
    
        parent::tearDown();
    
        reset_phpmailer_instance();
    }
    
    最后,如果你想使用原版PHPMailer 实例,而不是模拟邮件程序,只需尝试调用unset( $GLOBALS[\'phpmailer\'] ).

相关推荐

pingbacks testing

关于新wp安装(3.0.4)中PBs的功能测试,我有几个问题:发布帖子时是立即发送pingback,还是将其安排为cron作业?如果后者正确,作业多久运行一次,我可以手动触发它吗?除了将“尝试通知文章中链接到的任何博客”设置为“开”,当然还有帖子内容中指向另一个博客的链接之外,还有其他关于发送PBs的术语吗?(例如,发件人的帖子应该是公开的而不是私有的吗?博客应该是非私有的吗?)出站链接应该放在帖子内容中,还是可以放在帖子的自定义字段中,以便发送PB?如果我的博客中没有发送或接收PBs,那么调试和检测问题