Синтаксис Pest vs PHPUnit: Примеры expect()

Источник: «Pest vs PHPUnit Syntax: My Favorite expect() Examples»
У фреймворка тестирования Pest много поклонников, в основном из-за элегантного, читабельного «англоязычного» синтаксиса. Я покажу три моих любимых примера синтаксиса expect() и сравню аналогичные вещи в Pest vs PHPUnit.

Свойства объекта expect() в одном выражении

Позвольте продемонстрировать реальный пример из open-source проекта Larastreamers от Christoph Rumpel:

it('can fetch channel details from youtube', function() {
// Act
$channel = YouTube::channel('UCdtd5QYBx9MUVXHm7qgEpxA');

// Assert
expect($channel)
->youTubeCustomUrl->toBe('christophrumpel')
->name->toBe('Christoph Rumpel')
->description->toStartWith('Hi, I\'m Christoph Rumpel')
->onPlatformSince->toIso8601String()->toBe('2010-01-12T19:15:29+00:00')
->country->toBe('AT')
->thumbnailUrl->toBe('https://yt3.ggpht.com/ytc/AAUvwniFZUkXnS4vDKY4lDohrpFsyu1V2AJwt4CFZGy25Q=s800-c-k-c0x00ffffff-no-rj');
});

Видите этот expect() с цепочкой методов?

Если у вас есть объект/массив и необходимо проверить его части на наличие различных значений, это можно сделать в одном выражении.

Аналогичная функциональность в PHPUnit выглядела бы следующим образом:

public function testCanFetchChannelDetailsFromYoutube()
{
// Act
$channel = YouTube::channel('UCdtd5QYBx9MUVXHm7qgEpxA');

// Assert
$this->assertEquals('christophrumpel', $channel->youTubeCustomUrl);
$this->assertEquals('Christoph Rumpel', $channel->name);
$this->assertStringStartsWith('Hi, I\'m Christoph Rumpel', $channel->description);
$this->assertEquals('2010-01-12T19:15:29+00:00', $channel->onPlatformSince->toIso8601String());
$this->assertEquals('AT', $channel->country);
$this->assertEquals('https://yt3.ggpht.com/ytc/AAUvwniFZUkXnS4vDKY4lDohrpFsyu1V2AJwt4CFZGy25Q=s800-c-k-c0x00ffffff-no-rj', $channel->thumbnailUrl);

}

Вы можете увидеть три повторяющиеся части:

Каждое утверждение — отдельное PHP выражение.

Синтаксис «цепочки» Pest короче и элегантнее. Опять, на мой взгляд.

Ожидание X AND Y

Другой пример Pest — проверка класса и его содержимого в одном выражении.

test('users table contains pagination', function () {
$resp = actingAs($this->admin)
->get(route('users.index'));

$users = $resp->original->getData()['users'];

expect($users)
->toBeInstanceOf(\Illuminate\Pagination\LengthAwarePaginator::class)
->and($users->perPage())
->toBe(20);
});

Тот же код с PHPUnit:

public function testUsersTableContainsPagination()
{
$resp = $this->actingAs($this->admin)
->get(route('users.index'));

$users = $resp->original->getData()['users'];

$this->assertInstanceOf(\Illuminate\Pagination\LengthAwarePaginator::class, $users);
$this->assertEquals(20, $users->perPage());
}

В данном случае он не короче, но, на мой взгляд, более читабелен, поскольку утверждения об одной и той же переменной сгруппированы в одном выражении, а не в двух отдельных.

Ожидание (NOT) toContain()

О, а я уже упоминал о синтаксисе not с expect()?

Pest:

test('correct file can be seen on projects edit page', function () {
// ...

$resp = actingAs($this->user)
->get(route('projects.edit', $this->project));

expect($resp->content())
->toContain('project-file.pdf')
->not->toContain('task-file.pdf');
});

Два утверждения в одном выражении. Круто, правда? Правда?..

Версия PHPUnit:

public function testCorrectFileCanBeSeenOnProjectsEditPage()
{
$resp = $this->actingAs($user)
->get(route('projects.edit', $project));

$resp->assertSeeText('project-file.pdf');
$resp->assertDontSeeText('task-file.pdf');
}

Это личные предпочтения, как я уже говорил, но синтаксис Pest кажется мне более человечным.

Что вы думаете? Да или Нет?

Комментарии


Дополнительные материалы

Предыдущая Статья

React и FormData

Следующая Статья

Обновления PHP: Блокируйте регрессии с PHPStan