Unit Testing with Pest vs PHPUnit

We will see the process to convert a class with CRUD type tests from PHPUnit to Pest.

В качестве демонстрации мы вместе переведём тест для постов в PHPUnit. Если вы не хотите его смотреть, вы можете перейти к концу видео, к последней минуте или двум минутам, и посмотреть, как выглядит тест, или сразу перейти к репозиторию, о котором я вам говорил. Другими словами, вы можете спокойно пропустить этот урок. Если вы остались, значит, вы хотите посмотреть перевод. Очевидно, я собираюсь скопировать и вставить всю структуру, чтобы воспользоваться преимуществами и скопировать методы.

Итак, первое, что я собираюсь сделать, — это скопировать немного содержимого теста, созданного с помощью PHPUnit, чтобы оно было готово здесь. Это много копипаста. Помните, что я уже говорил вам об этом здесь. Я собираюсь удалить всё, что мне не понадобится. В данном случае я думаю, что эти два пользователя тоже хороши, хотя я не вру...
Давайте перейдём к следующему. Я собираюсь клонировать его, оставив место. Это будет хороший тест для получения идентификатора. Я собираюсь вырезать всё это досюда. Я помещу это сюда. Вы видите, что всё практически одинаково. Я вырезал это здесь. Вы можете оставить так, как я вам сказал. Но я предпочитаю, чтобы всё было в одной строке, потому что мы снова ничего не делаем с ответом. Так что логически мы можем упростить это. Я удаляю это, я удаляю ссылку, и это протокол, которому вы должны следовать, пока не закончите. Итак, мы будем продолжать, пока вы не закончите. Да, я собираюсь скопировать название. О, я не буду его вставлять. 404 будет для ошибок. Это было бы здесь, здесь, здесь. У нас уже есть один с заголовком. Нам нужно посмотреть, нужно ли это здесь, когда мы делаем это с помощью «Вредителя». В этом случае это было нужно, если оно не было отправлено, я не помню, было ли оно на другой странице, но я всё равно собираюсь определить его там, и в ожидании удаления этого сообщения оно останется в таком виде, как несуществующее, и мы оценим ответ здесь, я также дублирую его здесь:

test('проверить все', функция () {

 Категория::фабрика(10);
 $категории = Категория::получить()->toArray();

 $это->получить(
 '/api/категория/все',
 [
 'Авторизация' => 'Bearer ' . generateTokenAuth()
 ]
 )->assertOk()->assertJson($categories);
});

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

$this->post('/api/category', $данные, [
 'Принять' => 'приложение/json',
 'Авторизация' => 'Bearer ' . $this->generateTokenAuth()
 ])

Чтобы заменить метод проверки assertStringContainsString, которого нет в Pest, мы используем метод assertMatchesRegularExpression, который работает с регулярными выражениями:

assertMatchesRegularExpression("/Поле заголовка обязательно к заполнению./", $response->getContent());

... Мы продолжаем, немного удаляем это пространство, вводим здесь, я удаляю это, здесь я ввожу, ввожу здесь немного то же самое, должно быть, мы вставляем данные ... заголовок и третий параметр, и мы оцениваем ответ здесь, мы продолжаем здесь, сокращаем, перемещаем заголовок ... наконец, последний тест, удалите только тест, удалите, я вставляю здесь, мы собираемся удалить ответ, мы не передаём этот:

it("тест на удаление авторизации", функция () {
 Category::factory(1)->create();
 $category = Category::first();

 $this->удалить('/api/category/' . $category->id,[], [
 'Принять' => 'application/json',
 'Авторизация' => 'Bearer ' . $this->generateTokenAuth()
 ])->assertStatus(200)  ->assertContent('"хорошо"');

 $category = Category::find($category->id);
 $this->assertEquals($category, null);
});

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

Краткие сведения

Я надеюсь, что это было полезно для вас, точно так же, как я показываю это вам, если вы попали сюда, сейчас я покажу вам немного кода, который я представил вам раньше здесь, как я говорил вам в начале, как я говорил вам в предыдущих обзорах, я удалил ответ, когда в нем не было необходимости, поскольку мы оставили его там как мертвую переменную, а в остальном мы переместили заголовок и метод утверждения совпадений регулярных выражений, чтобы вычислять здесь регулярное выражение, которое является потоком, который мы передаем напрямую, в остальном все остается точно таким же, так что на этом мы заканчиваем тесты для публикации отсутствует пользовательский тест, который я уже сделал, как вы можете видеть, и я показываю его вам в следующем видео.

Тесты с Pest не сильно отличаются от тестов, реализованных с помощью PHPUnit, их синтаксис немного проще, и ниже приведены тесты, ранее реализованные с помощью Pest:

tests/Feature/Api/CategoryTest.php

<?php 
использовать приложение\Модели\Категорию;

тест('протестировать все', функция () {

 Категория:: завод (10);
 $categories = Категория::get()-> toArray();

 $this-> получить(
 '/api/категория/все', 
[ 
 'Авторизация' => 'Носитель' . generateTokenAuth()
 ]
 )->assertOk()->assertJson($categories);
});

it("тест получения по идентификатору", функция () {
 Category::factory(1)->create();
 $category = Category::first();

 $this->get('/api/category/' . $category->id, [
 'Авторизация' => 'Bearer ' . $this->generateTokenAuth()
 ])->assertStatus(200)->assertJson([
 'id' => $category->id,
 'title' => $category->title,
 'slug' => $category->slug
 ]);
});
it("тест получения по слагу", функция () {
 Category::factory(1)->create();
 $category = Category::first();

 $this->get('/api/category/slug/' . $category->slug, [
 'Авторизация' => 'Bearer ' . $this->generateTokenAuth()
 ])->assertStatus(200)->assertJson([
 'id' => $category->id,
 'title' => $category->title,
 'slug' => $category->slug
 ]);
});
it("тестовый пост", функция () {
 $данные = ['название' => 'Категория 1', 'slug' => 'cate-2-new'];
 $this->post('/api/category', $data, [
 'Accept' => 'application/json',
 'Authorization' => 'Bearer ' . $this->generateTokenAuth()
 ])->assertStatus(200)->assertJson($data).
});
it("проверка заголовка формы публикации", функция () {
 $data = ['title' => '', 'slug' => 'cate-2-new'];
 $response = $this->post('/api/category', $data, [
 'Accept' => 'application/json',
 'Authorization' => 'Bearer ' . $this->generateTokenAuth()
 ])->assertStatus(422);

 // $this->assertStringContainsString("Поле заголовка обязательно.", $response->getContent());
 $this-> assertMatchesRegularExpression("/Поле заголовка обязательно./", $response->getContent()); 
 // $testArray = array("a"=>"значение a", "b"=>"значение b"); 
    // $value = "значение b"; 
    /// функция assert для проверки того, является ли 'value' значением массива 
    // $this-> assertContains ($value, $testArray) ;

    // $this-> assertContains("Поле title обязательно.",['title'=>'["Поле title обязательно."]']) ;
});
it("проверка ошибки публикации формы slug", функция () {
 $data = ['название' => 'категория 3', 'slug' => ''];
 $response = $this->post('/api/category', $data, [
 'Принять' => 'application/json',
 'Авторизация' => 'Bearer ' . $this->generateTokenAuth()
 ])->assertStatus(422);

 // $response->assertStringContainsString("Поле slug обязательно", $response->getContent());
 $this->assertMatchesRegularExpression("/Поле slug обязательно для заполнения./", $response->getContent());
});
it("проверка уникальности поля slug в форме публикации", функция () {
 Category::create(
 [
 'title' => 'название категории',
 'slug' => 'cate-3'
 ]
 );

 $data = ['title' => 'cate 3', 'slug' => 'cate-3'];

 $response = $this->post('/api/category', $data, [
 'Accept' => 'application/json',
 'Authorization' => 'Bearer ' . $this->generateTokenAuth()
 ])->assertStatus(422);

 $this->assertStringContainsString("Слаг уже занят.", $response->getContent());
});

it("тест на получение по идентификатору 404", функция () {
 $this->get('/api/category/1000', [
 'Accept' => 'application/json',
 'Authorization' => 'Bearer ' . $this->generateTokenAuth()
 ])->assertStatus(404)->assertContent('"Не найдено"');

});
it("тест на получение по слагеру 404", функция () {
 $this->get('/api/category/slug/cate-not-exist', [
 'Принять' => 'application/json',
 ])->assertStatus(404)->assertContent('"Не найдено"');

});

it("тестовый запрос", функция () {
 Category::factory(1)->create();
 $categoryOld = Category::first();

 $dataEdit = ['название' => 'Новая категория 1', 'slug' => 'cate-1-new'];

 $this->put('/api/category/' . $categoryOld->id, $dataEdit, [
 'Принять' => 'приложение/json',
 'Авторизация' => 'Bearer ' . $this->generateTokenAuth()
 ])->assertStatus(200)->assertJson($dataEdit).
});

it("тестирование удаления авторизации", функция () {
 Category::factory(1)->create();
 $category = Category::first();

 $this->delete('/api/category/' . $category->id,[], [
 ринять' => 'приложение/json',
 'Авторизация' => 'Bearer ' . $this->generateTokenAuth()
 ])->assertStatus(200)
 ->assertContent('"ОК"');

 $category = Category::find($category->id);
 $this->assertEquals($category, null);
});

Поскольку эти ресурсы защищены аутентификацией, мы определяем метод генерации токена в классе Pest:

tests/Pest.php

использует(TestCase::класс, RefreshDatabase::класс)->в('Особенность');
функция generateTokenAuth()
{
 User::factory()->create();
 возвращает User::first()->createToken('myapptoken')->plainTextToken;
}

В приведённом выше файле вы также можете увидеть, что у них есть признак RefreshDatabase, который мы использовали ранее с PHPUnit.

- Andrés Cruz

En español

This material is part of my complete course and book; You can purchase them from the books and/or courses section, Curso y Libro Laravel 12 con Tailwind Vue 3, introducción a Jetstream Livewire e Inerta desde cero - 2025.

I agree to receive announcements of interest about this Blog.

!Courses from!

10$

On Udemy

There are 0d 04:27!


Udemy

!Courses from!

4$

In Academy

View courses

!Books from!

1$

View books
¡Become an affiliate on Gumroad!