在 Laravel 8 中测试邮件内容

发布时间 作者

Testing Mailable Content in Laravel 8 image

Laravel 8.18.0 添加了用于测试邮件内容 HTML 和纯文本的方法。这些方法在 文档 中有描述,但我希望通过一个简单的示例来演示它们如何有用。

文档演示了以下用于测试邮件的方法

public function test_mailable_content()
{
$user = User::factory()->create();
 
$mailable = new InvoicePaid($user);
 
$mailable->assertSeeInHtml($user->email);
$mailable->assertSeeInHtml('Invoice Paid');
 
$mailable->assertSeeInText($user->email);
$mailable->assertSeeInText('Invoice Paid');
}

如您所见,邮件实例方便地提供了断言方法,您可以使用这些方法来确保电子邮件包含预期内容。让我们来看一个简单的例子,它可以帮助巩固这个概念。

开始

假设您正在构建一个简单的电子邮件,该电子邮件将确认码发送到用户的电子邮件,以便在用户被允许执行操作之前验证某些内容。我们将发送 HTML 版本,但您可以测试电子邮件的纯文本版本,并参考上面的示例进行文本断言。

让我们从使用 Laravel 文档中的 安装方法 创建一个新的 Laravel 项目开始,使用 Laravel Sail。

# I use ~/code/sandbox as path for playground projects
cd ~/code/sandbox
curl -s https://laravel.build/mailable-demo | bash

创建项目后,您可以启动 Laravel 应用程序服务器

vendor/bin/sail up -d

创建邮件

我们准备创建要测试的邮件,以及相应的模板。我们将使用 artisan 控制台创建类并在项目中创建模板

# Create the mailable
sail artisan make:mail ConfirmationCode
 
# Create the template
mkdir -p resources/views/emails
echo 'Hello from HTML!' \
> resources/views/emails/confirmation-code.blade.php

接下来,更新 ConfirmationCode 类,使其如下所示

<?php
 
namespace App\Mail;
 
use App\Models\User;
use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
 
class ConfirmationCode extends Mailable
{
use Queueable, SerializesModels;
 
/**
* @var string
*/
public $code;
 
/**
* @var \App\Models\User
*/
public $user;
 
/**
* Create a new message instance.
*
* @param string $code
*/
public function __construct(User $user, string $code)
{
$this->user = $user;
$this->code = $code;
}
 
/**
* Build the message.
*
* @return $this
*/
public function build()
{
return $this->view('emails.confirmation-code');
}
}

我们将使用一个简单的 string $code 属性用于邮件,但一个真正的实现可能使用一个服务来生成与用户关联的随机代码。

接下来,让我们使用提供的 tests/Feature/ExampleTest.php 文件来测试我们的邮件

<?php
 
namespace Tests\Feature;
 
use App\Mail\ConfirmationCode;
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
 
class ExampleTest extends TestCase
{
use RefreshDatabase;
 
/**
* A basic test example.
*
* @return void
*/
public function testBasicTest()
{
$user = User::factory()->create();
$subject = new ConfirmationCode($user, '1234');
 
$subject->assertSeeInHtml('Hello from HTML!');
}
}

此时您的测试应该通过

vendor/bin/sail test tests/Feature
 
PASS Tests\Feature\ExampleTest
basic test
 
Tests: 1 passed
Time: 1.06s

接下来,让我们调整测试,使其期望确认码

public function testBasicTest()
{
$user = User::factory()->create();
$subject = new ConfirmationCode($user, '1234');
 
$subject->assertSeeInHtml('Hello ' . $user->name);
$subject->assertSeeInHtml('Here is your confirmation code: <strong>1234</strong>');
}

如果您重新运行测试,它现在将失败。接下来,让我们更新模板以包含用户的姓名并包含确认码

{{-- resources/emails/confirmation-code.blade.php --}}
Hello {{ $user->name }}
 
Here is your confirmation code: <strong>{{ $code }}</strong>

此时,您的测试将通过,并且您可以确保您的邮件包含必要的确认码!

在实际应用中,您可能会从服务中生成电子邮件代码,并将其替换为一个假的或部分模拟的代码,但您可以看到我们如何确保邮件模板包含预期的文本。方便的是,您现在可以直接测试您的邮件,而无需额外的操作或包!请务必查看官方 Laravel 邮件文档,以了解有关邮件的更多信息。

Paul Redmond photo

Laravel 新闻的撰稿人。全栈 web 开发人员和作者。

Cube

Laravel 新闻通讯

加入 40k+ 其他开发者,不要错过任何新的技巧、教程等等。

Laravel Forge logo

Laravel Forge

轻松创建和管理您的服务器,并在几秒钟内部署您的 Laravel 应用程序。

Laravel Forge
Tinkerwell logo

Tinkerwell

Laravel 开发人员必备的代码运行器。使用 AI、自动补全和本地和生产环境的即时反馈进行微调。

Tinkerwell
No Compromises logo

不妥协

Joel 和 Aaron,来自不妥协播客的两名经验丰富的开发者,现在可以为您的 Laravel 项目聘用。 ⬧ 固定费率 $7500/月。 ⬧ 无需漫长的销售流程。 ⬧ 无合同。 ⬧ 100% 返款保证。

不妥协
Kirschbaum logo

Kirschbaum

提供创新和稳定性,以确保您的 Web 应用程序取得成功。

Kirschbaum
Shift logo

Shift

正在运行旧版本的 Laravel?即时、自动的 Laravel 升级和代码现代化,以保持您的应用程序新鲜。

Shift
Bacancy logo

Bacancy

通过经验丰富的 Laravel 开发人员为您的项目注入活力,他们拥有 4-6 年的经验,每月只需 $2500。获得 160 小时的专业知识和无风险的 15 天试用。立即安排通话!

Bacancy
Lucky Media logo

Lucky Media

立即获取幸运 - Laravel 开发的理想选择,拥有十多年的经验!

Lucky Media
Lunar: Laravel E-Commerce logo

Lunar:Laravel 电子商务

Laravel 的电子商务。一个开源软件包,将现代无头电子商务功能的力量带到 Laravel。

Lunar:Laravel 电子商务
LaraJobs logo

LaraJobs

官方 Laravel 招聘网站

LaraJobs
SaaSykit: Laravel SaaS Starter Kit logo

SaaSykit:Laravel SaaS 启动工具包

SaaSykit 是一个 Laravel SaaS 启动工具包,包含运行现代 SaaS 所需的所有功能。支付、精美的结账、管理面板、用户仪表板、身份验证、现成组件、统计数据、博客、文档等等。

SaaSykit:Laravel SaaS 启动工具包
Rector logo

Rector

您无缝升级 Laravel、降低成本和加速创新的合作伙伴,帮助企业取得成功

Rector
MongoDB logo

MongoDB

通过 MongoDB 和 Laravel 的强大集成增强您的 PHP 应用程序,使开发人员能够轻松高效地构建应用程序。支持事务、搜索、分析和移动用例,同时使用熟悉的 Eloquent API。了解 MongoDB 的灵活、现代数据库如何改变您的 Laravel 应用程序。

MongoDB
Maska is a Simple Zero-dependency Input Mask Library image

Maska 是一个简单的零依赖输入掩码库

阅读文章
Add Swagger UI to Your Laravel Application image

将 Swagger UI 添加到您的 Laravel 应用程序

阅读文章
Assert the Exact JSON Structure of a Response in Laravel 11.19 image

在 Laravel 11.19 中断言响应的精确 JSON 结构

阅读文章
Build SSH Apps with PHP and Laravel Prompts image

使用 PHP 和 Laravel 提示构建 SSH 应用程序

阅读文章
Building fast, fuzzy site search with Laravel and Typesense image

使用 Laravel 和 Typesense 构建快速、模糊的网站搜索

阅读文章
Add Comments to your Laravel Application with the Commenter Package image

使用 Commenter 包将评论添加到您的 Laravel 应用程序

阅读文章