Php Laravel 5.4使用Mail::fake进行测试-如何访问邮件正文?
我正在运行Laravel 5.4,并使用Mail::fake()和Mail::assertSent()测试邮件。hasTo($email)和hasCc($email)之类的东西都有断言,但似乎没有访问消息内容的方法。我想测试电子邮件正文是否包含特定字符串 伪代码:Php Laravel 5.4使用Mail::fake进行测试-如何访问邮件正文?,php,laravel-5,Php,Laravel 5,我正在运行Laravel 5.4,并使用Mail::fake()和Mail::assertSent()测试邮件。hasTo($email)和hasCc($email)之类的东西都有断言,但似乎没有访问消息内容的方法。我想测试电子邮件正文是否包含特定字符串 伪代码: Mail::assertSent(UserInvited::class, function($mail) use($token) { return $mail->bodyContains($token); # that
Mail::assertSent(UserInvited::class, function($mail) use($token) {
return $mail->bodyContains($token); # that method does not really exist
});
这可能吗?有一个包,你可以拉进去测试邮件。但就目前而言,你必须要有一点创造性,让它发挥作用,因为他们没有在需求中指定Laravel 5.4.*。因此,进入您的
composer.json
文件,根据更新后的Laravel 5.4.*要求,从这个repo构建您自己的包,如下所示:
"repositories": [
{
"type": "package",
"package": {
"name": "spinen/laravel-mail-assertions",
"version": "0.1.2",
"require": {
"php": ">=5.5.0",
"illuminate/support": "~5.1.10|5.2.*|5.3.*|5.4.*",
"swiftmailer/swiftmailer": "~5.1"
},
"require-dev": {
"mockery/mockery": "^0.9.1",
"phpunit/phpunit": "~4.0|~5.0",
"psy/psysh": "^0.5.1",
"satooshi/php-coveralls": "^0.6.1",
"symfony/var-dumper": "~2.7|~3.0"
},
"autoload": {
"psr-4": {
"Spinen\\MailAssertions\\": "src"
}
},
"autoload-dev": {
"psr-4": {
"Spinen\\MailAssertions\\": "tests"
}
},
"config": {
"preferred-install": "dist"
},
"dist": {
"url": "https://github.com/spinen/laravel-mail-assertions/archive/0.1.1.zip",
"type": "zip"
}
}
}
],
然后,在require dev
下,添加自定义软件包:
"require-dev": {
"spinen/laravel-mail-assertions": "^0.1.2"
},
安装后,在
.env
文件中设置MAIL\u DRIVER=log
,并将Spinen\mailsertions\MailTracking
特征拉入测试。此特征有一些方法,如seemailcontains
,seemailsubjectcontains
等,可以断言发送的任何电子邮件中都存在文本。遇到相同情况,并且没有任何搜索机会-调试后:
Mail::assertSent(InstanceOfMailableEmail::class, function($mail) use ($needle) {
// now your email has properties set
$mail->build();
//check the content body for a string
return strpos($mail->viewData['content'], $needle) !== false;
});
以下是我的做法(以及关于如何做其他事情的有用提示):
GitHub上存在一个问题,要求: 泰勒似乎没有发表评论就结束了这一请求 如果要检查呈现的邮件中是否有字符串,可以在不模拟邮件外观的情况下进行检查。只要这样做:
$mail = new Mailable(...);
$html = $mail->render();
$found = (strpos($html, 'Hello') !== false);
您找到解决方案了吗?在Laravel 5.6中,
$mail->viewData
为空。它是否仅从5.7开始工作?而viewData
只是用来访问邮件的属性,对吗?获取mailable?@Adam的呈现内容没有任何帮助。我对5.6不太熟悉,因为这是一年多以前的事了,我也不确定5.7+的细节。我看到其他答案也提到了$mail->viewData
。内容是可邮件类的属性吗?viewData
是,它是一个数组<代码>内容是该数组上的键之一;在buildViewData
中发生了一些神奇的事情,这表明内容
应该是Mailable
的属性(因为它通过这个反射来填充viewData
),但我不记得为什么我不能使用它。也许它是受保护的,我不记得(那是很久以前的事了;))我使用的是Laravel 5.6,调用build后,$mail->viewData
似乎是空的。这是一个非常糟糕的解决方案,因为您是在断言源/原始变量,而不是呈现的电子邮件。可能您的呈现电子邮件不会包含以下内容:that@DenisMysenko如果存在$mail->getContent()
,则很乐意使用它,而无需此解决方法。如果你有想法如何完成这样的断言,请张贴!
$mail = new Mailable(...);
$html = $mail->render();
$found = (strpos($html, 'Hello') !== false);