钩子

Pest 钩子类似于您准备饭菜时可能采取的步骤 - 首先,您收集并准备食材,然后烹饪饭菜,最后清理自己。同样,钩子允许您在每个测试或文件之前和之后执行特定的操作,例如设置测试数据、初始化测试环境或在测试完成后清理资源。

通过在 Pest 中使用钩子,您可以简化测试流程,自动化重复性任务。无论您是为小型项目编写单元测试,还是为大型应用程序构建复杂的测试套件,钩子都可以帮助您节省时间并提高测试质量。

此外,如果您希望仅对特定组的测试运行钩子,可以在 describe() 函数中包含该钩子。

1beforeEach(function () {
2 //
3});
4 
5describe('something', function () {
6 beforeEach(function () {
7 //
8 });
9 
10 //
11});
12 
13test('something', function () {
14 //
15});

以下是 Pest 中可用的钩子列表

beforeEach()

在当前文件中每个测试之前执行提供的闭包,确保在每个测试之前完成任何必要的设置或配置。

1beforeEach(function () {
2 // Prepare something before each test run...
3});

使用 beforeEach() 钩子时,可以初始化将在当前文件中所有测试之间共享的属性。例如,您可以使用 beforeEach() 在运行每个测试之前初始化 $repository 属性,确保它在文件中后续测试中可用。

1beforeEach(function () {
2 $this->userRepository = new UserRepository();
3});
4 
5it('may be created', function () {
6 $user = $this->userRepository->create();
7 
8 expect($user)->toBeInstanceOf(User::class);
9});

afterEach()

在当前文件中每个测试之后执行提供的闭包,允许您清理测试期间可能已修改的任何资源或状态。

1afterEach(function () {
2 // Clear testing data after each test run...
3});

因此,使用上面的示例,如果 beforeEach() 钩子用于初始化 $userRepository 属性,则 afterEach() 钩子如果需要,可以在每个测试后“清理”它。这确保了对象可能正在使用的任何资源在测试之间都被释放或重置,防止任何干扰或意外行为。

1afterEach(function () {
2 $this->userRepository->reset();
3});

可选地,您可以使用 after() 方法在特定测试后执行清理任务。当您需要清理特定于单个测试的资源而不是在文件中所有测试之间共享的资源时,这很有用。

1it('may be created', function () {
2 $this->userRepository->create();
3 
4 expect($user)->toBeInstanceOf(User::class);
5})->after(function () {
6 $this->userRepository->reset();
7});

beforeAll()

在当前文件中运行任何测试之前执行一次提供的闭包,允许您执行适用于所有测试的任何必要的设置或初始化。

1beforeAll(function () {
2 // Prepare something once before any of this file's tests run...
3});

需要注意的是,与 beforeEach() 钩子不同,$this 变量在 beforeAll() 钩子中不可用。这是因为钩子在任何测试执行之前运行,因此没有测试类或对象的实例,该变量可以引用该实例。

afterAll()

在当前文件中所有测试完成后执行一次提供的闭包,允许您执行任何必要的清理或拆卸任务。

1afterAll(function () {
2 // Clean testing data after all tests run...
3});

就像 beforeAll() 方法一样,$this 变量在 afterAll() 钩子中不可用。这是因为 afterAll() 钩子通常在文件中所有测试完成后运行,因此不再有测试实例或对象,该变量可以引用该实例。


掌握了使用钩子为测试设置前提条件和清理操作后,我们就可以讨论“数据集”,它允许您使用不同的输入或参数运行相同的测试。数据集可用于在各种条件和边缘情况下彻底测试您的代码,让您可以识别和修复可能不会立即显现的错误:数据集 →