在 Laravel 8 中测试邮件内容
发布时间 作者 Paul Redmond
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 projectscd ~/code/sandboxcurl -s https://laravel.build/mailable-demo | bash
创建项目后,您可以启动 Laravel 应用程序服务器
vendor/bin/sail up -d
创建邮件
我们准备创建要测试的邮件,以及相应的模板。我们将使用 artisan 控制台创建类并在项目中创建模板
# Create the mailablesail artisan make:mail ConfirmationCode # Create the templatemkdir -p resources/views/emailsecho '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 邮件文档,以了解有关邮件的更多信息。