自定义助手

如果您正在转向函数式方法来编写测试,您可能会想知道在哪里放置以前在测试类中受保护或私有的助手方法。使用 Pest 时,这些助手方法应该转换为简单的函数。

例如,如果您的助手特定于某个测试文件,您可以直接在测试文件中创建该助手。在您的助手内部,您可以调用 test() 函数来访问测试类实例,该实例通常可以通过 $this 获取。

1use App\Models\User;
2use Tests\TestCase;
3 
4function asAdmin(): TestCase
5{
6 $user = User::factory()->create([
7 'admin' => true,
8 ]);
9 
10 return test()->actingAs($user);
11}
12 
13it('can manage users', function () {
14 asAdmin()->get('/users')->assertOk();
15})

注意:如果您的助手创建了一个自定义断言,您应该编写一个专用的 自定义断言 来代替。

如果您的测试助手在整个测试套件中使用,您可以在 tests/Pest.phptests/Helpers.php 文件中定义它们。或者,您可以创建一个 tests/Helpers 目录来存放您自己的助手文件。Pest 会自动加载所有这些选项。

1use App\Clients\PaymentClient;
2use Mockery;
3 
4// tests/Pest.php or tests/Helpers.php
5function mockPayments(): object
6{
7 $client = Mockery::mock(PaymentClient::class);
8 
9 //
10 
11 return $client;
12}
13 
14// tests/Feature/PaymentsTest.php
15it('may buy a book', function () {
16 $client = mockPayments();
17 
18 //
19})

作为将助手方法定义为函数的替代方法,您可以在您的基础测试类中定义受保护的方法,然后使用 $this 变量在您的测试用例中访问它们。

1use App\Clients\PaymentClient;
2use PHPUnit\Framework\TestCase as BaseTestCase;
3use Mockery;
4 
5// tests/TestCase.php
6class TestCase extends BaseTestCase
7{
8 protected function mockPayments(): void
9 {
10 $client = Mockery::mock(PaymentClient::class);
11 
12 //
13 
14 return $client;
15 }
16}
17 
18// tests/Pest.php
19pest()->extend(TestCase::class)->in('Feature');
20 
21// tests/Feature/PaymentsTest.php
22it('may buy a book', function () {
23 $client = $this->mockPayments();
24 
25 //
26})

在本节中,我们探讨了创建自定义助手的过程。深入了解,您甚至可能想要生成一个自定义断言。让我们在下一章跳转到该主题:自定义断言