从 2.x 升级到 3.x
预计升级时间:2 分钟
我们努力记录每个潜在的破坏性更改,但其中一些更改可能存在于框架中使用频率较低的部分。因此,只有一部分这些更改可能会影响您的应用程序。
更新依赖项
影响可能性:高
Pest 3 现在需要 PHP 8.2.0 或更高版本。要开始从 Pest 2 迁移到 Pest 3,请将应用程序的 composer.json
文件中的 pestphp/pest
依赖项更新为 ^3.0
。
1- "pestphp/pest": "^2.0",2+ "pestphp/pest": "^3.0",
此外,如果您使用的是 Laravel,请将 Collision 升级到版本 8。请注意,需要 Laravel 11。
1- "nunomaduro/collision": "^7.0",2+ "nunomaduro/collision": "^8.0",
所有其他 Pest 维护的插件都应在应用程序的 composer.json
文件中更新为版本 ^3.0
。
1- "pestphp/pest-plugin-laravel": "^2.0",2+ "pestphp/pest-plugin-laravel": "^3.0",
PHPUnit 11 更改
影响可能性:中
Pest 3 基于 PHPUnit 11 构建。这意味着对 PHPUnit 11 做出的任何重大更改都可能影响您的测试套件。要检查 PHPUnit 11 中引入的所有更改,请查阅 PHPUnit 11 变更日志。
toHaveMethod
和 toHaveMethods
断言
影响可能性:低
toHaveMethod
和 toHaveMethods
断言已被架构断言 toHaveMethod
和 toHaveMethods
替换。如果您使用过这些断言,则无法再提供对象,因为架构断言需要命名空间或类名。
1-expect($object)->toHaveMethod('method');2+expect($object::class)->toHaveMethod('method');
pest()
Pest 2 已弃用功能
在 Pest 2 发布期间,一些功能已弃用,现在在 Pest 3 中已移除。以下是要注意的更改
tap()
方法
影响可能性:低
在执行高阶测试时,您可能使用了 tap()
方法在运行时需要延迟评估的对象上调用断言。在 Pest 2 中,tap()
方法已弃用,在 Pest 3 中已移除。相反,您应该使用 defer()
方法。
1it('creates admins')2- ->tap(fn () => $this->artisan('user:create --admin'))3+ ->defer(fn () => $this->artisan('user:create --admin'))4 ->assertDatabaseHas('users', ['id' => 1]);
从 1.x 升级到 2.x
预计升级时间:2 分钟
我们努力记录每个潜在的破坏性更改,但其中一些更改可能存在于框架中使用频率较低的部分。因此,只有一部分这些更改可能会影响您的应用程序。
更新依赖项
影响可能性:高
Pest 2 现在需要 PHP 8.1.0 或更高版本。要开始从 Pest 1 迁移到 Pest 2,请将应用程序的 composer.json
文件中的 pestphp/pest
依赖项更新为 ^2.0
。
1- "pestphp/pest": "^1.22",2+ "pestphp/pest": "^2.0",
接下来,如果包含 PHPUnit,您可以将其从依赖项列表中移除。
1- "phpunit/phpunit": "^9.5.10",
此外,如果您使用的是 Laravel,请将 Collision 升级到版本 7。请注意,需要 Laravel 10。
1- "nunomaduro/collision": "^6.0",2+ "nunomaduro/collision": "^7.0",
如果您使用的是并行插件(或 Paratest),您可以将其从依赖项中移除,因为它现在已默认包含在 Pest 中。
1- "brianium/paratest": "^6.8.1",2- "pestphp/pest-plugin-parallel": "^1.2.1",
全局断言插件已存档,应将其从依赖项中移除。
1- "pestphp/pest-plugin-global-assertions": "^1.0.0",
如果您依赖于全局断言插件,您可以使用 $this
变量访问相同的底层断言。或者,您可以迁移到 断言 API。
1test('sum', function () {2 $result = sum(1, 2);3 4- assertSame(3, $result);5+ $this->assertSame(3, $result); // or expect($result)->toBe(3)6});
所有其他 Pest 维护的插件都应在应用程序的 composer.json
文件中更新为版本 ^2.0
。
1- "pestphp/pest-plugin-laravel": "^1.4",2+ "pestphp/pest-plugin-laravel": "^2.0",
如果您使用的是 Faker 插件,则 faker()
函数已重命名为 fake()
。您需要更新所有用法。
1- use function Pest\Faker\faker;2+ use function Pest\Faker\fake;3 4test('faker', function () {5- expect(faker()->name())->toBeString();6+ expect(fake()->name())->toBeString();7});
PHPUnit 10 更改
影响可能性:中
如果您之前使用的是 PHPUnit 而不是 Pest,则可能需要更新您的 phpunit.xml
文件。在这种情况下,首次运行 Pest 2 时可能会遇到以下消息。
1WARN Your XML configuration validates against a deprecated schema. Migrate your XML configuration using "--migrate-configuration"!
要解决此问题,只需使用 --migrate-configuration
选项重新运行 Pest。
1./vendor/bin/pest --migrate-configuration
Pest 2 基于 PHPUnit 10 构建。这意味着对 PHPUnit 10 做出的任何重大更改都可能影响您的测试套件。要检查 PHPUnit 10 中引入的所有更改,请查阅 PHPUnit 10 变更日志。
高阶测试
影响可能性:低
在执行高阶测试时,您可能使用了 tap()
方法在运行时需要延迟评估的对象上调用断言。在 Pest 2 中,tap()
方法已弃用。相反,您应该使用 defer()
方法。
1it('creates admins')2- ->tap(fn () => $this->artisan('user:create --admin'))3+ ->defer(fn () => $this->artisan('user:create --admin'))4 ->assertDatabaseHas('users', ['id' => 1]);
数据集
绑定数据集
影响可能性:极低
如果您正在使用“绑定”数据集并绑定单个数据集参数,则现在必须键入相应的测试参数。
1-it('can generate the full name of a user', function ($user, $fullName) {2+it('can generate the full name of a user', function (User $user, $fullName) {3 expect($user->full_name)->toBe($fullName);4})->with([5 [fn() => User::factory()->create(['first_name' => 'Nuno', 'last_name' => 'Maduro']), 'Nuno Maduro'],6 [fn() => User::factory()->create(['first_name' => 'Luke', 'last_name' => 'Downing']), 'Luke Downing'],7 [fn() => User::factory()->create(['first_name' => 'Freek', 'last_name' => 'Van Der Herten']), 'Freek Van Der Herten'],8]);
作用域数据集
影响可能性:极低
虽然我们之前在 Pest 1 中有文档说明数据集应该只使用 tests/Pest.php
或 tests/Datasets.php
文件中的 dataset
函数声明,但实际上您可以在测试套件中的任何测试文件中声明数据集。但是,在 Pest 2 中,随着 作用域数据集 的引入,在测试文件中声明的数据集只能在同一测试文件中使用。因此,如果您有一个需要全局访问的数据集,请确保将其放在 tests/Pest.php
或 tests/Datasets.php
文件中。
至此,Pest 2 升级指南结束。在下一章中,我们将介绍如何轻松地将您的测试从 PHPUnit 迁移到 Pest:从 PHPUnit 迁移