在本地服务器上构建和测试网站时,我想模拟通过phpmailer的成功发送,因此避免实际发送电子邮件。
我通常使用if ($mail->Send()) { the mail was sent, now do this }
。
对于本地测试,我认为最好的方法是跳过整个phpmailer包含,而不是添加很多if语句等。
但是跳过phpmailer会导致php抱怨$mail->Send()
,$mail->addAddress('emailaddress')
等。
我该如何伪造函数(或对象/类),以使对$mail->Send()
的调用始终为true,而其余的$mail->something()
等仅被忽略/ true,从而不发送电子邮件?
答案 0 :(得分:2)
扩展PHPMailer类并覆盖public function send()
。
class UnitTestMailer extends PHPMailer {
public function send() {
return $this;
}
}
class User {
public function __construct(PHPMailer $mailer) {
$this->mailer = $mailer;
}
public function sendActiviation() {
return $this->mailer->send();
}
}
// ... somewhere in your test
public function test_if_from_is_properly_set() {
// ...
$user = new User(new UnitTestMailer);
// ...
$mailer = $user->sendActivation();
$this->assertEquals($expectedFrom, $mailer->From);
}
答案 1 :(得分:0)
我根据环境使用INI文件为PHPMailer提供配置变量。 Live显然具有服务器的邮件设置。本地使用我的Gmail帐户凭据发送邮件。
您可以两全其美:)
例如在工作目录中的某个位置保留一个config.ini
文件(我倾向于使用root,但这是首选项),并确保它位于您的.gitignore
或类似文件中。您的本地版本如下所示:
[PHPMailer Settings]
EMAIL_HOST = "smtp.gmail.com"
EMAIL_PORT = 587
EMAIL_SMTPSECURE = "tls"
EMAIL_SMTPAUTH = "true"
EMAIL_USERNAME = "my_email@gmail.com"
EMAIL_PASSWORD = "my_password"
然后在您的PHP中:
$ini = parse_ini_file($_SERVER['DOCUMENT_ROOT'] . "/config.ini", true, INI_SCANNER_TYPED);
// use settings from INI file:
$foo = $ini['PHPMailer Settings']['EMAIL_HOST'];
$bar = $ini['PHPMailer Settings']['EMAIL_PORT'];
将INI文件的语法更改为如下所示,并将其重命名为config.ini.php
:
; <?php
; die();
; /*
[PHPMailer Settings]
EMAIL_HOST = "smtp.gmail.com"
EMAIL_PORT = 587
EMAIL_SMTPSECURE = "tls"
EMAIL_SMTPAUTH = "true"
EMAIL_USERNAME = "my_email@gmail.com"
EMAIL_PASSWORD = "my_password"
; */ ?>
(请记住在PHP代码中使用新文件名)
PHP仍然可以解析设置,但是如果有人尝试访问INI文件,它将被解析为PHP注释并仅显示";"