Php Laravel 5.4使用Mail::fake进行测试-如何访问邮件正文?

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

我正在运行Laravel 5.4,并使用Mail::fake()和Mail::assertSent()测试邮件。hasTo($email)和hasCc($email)之类的东西都有断言,但似乎没有访问消息内容的方法。我想测试电子邮件正文是否包含特定字符串

伪代码:

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);