在 PHPUnit 数据提供器中使用 Eloquent 工厂

发布于 作者

Using Eloquent Factories With PHPUnit Data Providers image

在功能测试中使用 Laravel 工厂有几种方法,例如在 `setUp()` 中创建模型,以便在多个测试中使用它,或者直接在单个测试用例中创建。如果您有一个测试用例,您希望针对各种数据进行测试,您可能想使用 PHPUnit 的 数据提供器 和 Eloquent 模型。

在功能测试中使用数据提供器可能会遇到问题,因为它们在 Laravel 通过框架的 `TestCase` 启动之前运行(`setUp()` 期间运行)。数据提供器在运行 `phpunit` 过程的早期被解析,因此,如果您想使用它们,您会遇到以下错误

<?php
 
namespace Tests\Feature;
 
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use PHPUnit\Framework\Attributes\DataProvider;
use Tests\TestCase;
 
class ExampleTest extends TestCase
{
use RefreshDatabase;
 
#[DataProvider('nonAdminUsers')]
public function test_non_admin_users_cannot_access_admin($user): void
{
$response = $this
->actingAs($user())
->get('/admin')
->assertStatus(403);
}
 
public static function nonAdminUsers(): array
{
return [
[User::factory()->player()->create()],
[User::factory()->coach()->create()],
[User::factory()->owner()->create()],
];
}
}

如果您运行上面的测试,您应该会收到类似于以下的错误,具体取决于您使用的 Laravel 版本——以下是我在 Laravel 11 上得到的错误

$ vendor/bin/phpunit tests/Feature/ExampleTest.php
 
There was 1 PHPUnit error:
 
1) Tests\Feature\ExampleTest::test_non_admin_users_cannot_access_admin
The data provider specified for Tests\Feature\ExampleTest::test_non_admin_users_cannot_access_admin is invalid
A facade root has not been set.
 
tests/Feature/ExampleTest.php:18

这是因为当数据提供器代码运行时,Laravel 应用程序尚未启动!如果您是 Pest PHP 用户,Bound Datasets 示例说明了使用闭包来获取模型数据

it('can generate the full name of a user', function (User $user) {
expect($user->full_name)->toBe("{$user->first_name} {$user->last_name}");
})->with([
fn() => User::factory()->create(['first_name' => 'Nuno', 'last_name' => 'Maduro']),
fn() => User::factory()->create(['first_name' => 'Luke', 'last_name' => 'Downing']),
fn() => User::factory()->create(['first_name' => 'Freek', 'last_name' => 'Van Der Herten']),
]);

在 PHPUnit 中,我们可以使用闭包将代码通过数据提供器传递给我们的测试,而不会立即尝试创建数据

namespace Tests\Feature;
 
use App\Models\User;
use Illuminate\Foundation\Testing\RefreshDatabase;
use PHPUnit\Framework\Attributes\DataProvider;
use Tests\TestCase;
 
class ExampleTest extends TestCase
{
use RefreshDatabase;
 
#[DataProvider('nonAdminUsers')]
public function test_non_admin_users_cannot_access_admin($user): void
{
$response = $this
->actingAs($user())
->get('/admin')
->assertStatus(403);
}
 
public static function nonAdminUsers(): array
{
return [
[fn(): User => User::factory()->player()->create()],
[fn(): User => User::factory()->coach()->create()],
[fn(): User => User::factory()->owner()->create()],
];
}
}

请注意 `$user()` 调用,我们将其传递给 `actingAs()`。如果您需要在不同的地方使用模型,只需将其分配给一个变量即可。现在,工厂数据是在测试中创建的,这正是我们想要的!要了解有关 Laravel 中的 HTTP 功能测试的更多信息,请查看 文档

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,来自“No Compromises”播客的两位经验丰富的开发人员,现在可以为您的 Laravel 项目雇用。⬧ 固定费率为 7500 美元/月。⬧ 没有冗长的销售流程。⬧ 没有合同。⬧ 100%退款保证。

没有妥协
Kirschbaum logo

Kirschbaum

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

Kirschbaum
Shift logo

Shift

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

Shift
Bacancy logo

Bacancy

仅需 2500 美元/月,即可为您的项目配备一位经验丰富的 Laravel 开发人员(4-6 年经验)。获得 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

在您的 Laravel 应用程序中添加 Swagger UI

阅读文章
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 Prompts 构建 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 应用程序添加评论

阅读文章