Синтаксис Pest vs PHPUnit: Примеры expect()
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);
}
Вы можете увидеть три повторяющиеся части:
$this->
$channel->
- и
assertEquals()
или ещё более длинныйassertStringStartsWith()
Каждое утверждение — отдельное 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 кажется мне более человечным
.
Что вы думаете? Да или Нет?