Pillole Laravel: esecuzione dei test con PHPUnit

Devo testare delle API con Unit Test di una classe Category. Come primo passaggio genero la classe di Test:

php artisan make:test CategoryTest

Questo comando mi genera un file sotto tests/Feature/CategoryTest.php che tosto personalizzo come segue, un metodo per ogni operazione del CRUD:

<?php

namespace Tests\Feature;

use App\Category;
use Tests\TestCase;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;

class CategoryTest extends TestCase
{

    public function testsCategoriesAreCreatedCorrectly()
    {
        $headers = ['Authorization' => "ajs8ebddau"];

        $payload = [
            'name' => 'Libri e Riviste INS',
            'short' => 'libri INS',
        ];

        $this->json('POST', '/api/categories', $payload, $headers)
            ->assertStatus(302)
            ->assertJson([
                'name' => 'Libri e Riviste INS',
                'short' => 'libri INS'
            ]);
    }

    public function testsCategoriesAreUpdatedCorrectly()
    {
        $headers = ['Authorization' => "ajs8ebddau"];

        $category = new Category;
        $category->name = 'Libri e Riviste TEST';
        $category->short = 'libri TEST';
        $category->save();

        $id = $category->id;

        $payload = [
            'name' => 'Libri e Riviste UPDATE',
            'short' => 'libri UPDATE',
        ];

        $response = $this->json('PUT', '/api/categories/' . $id, $payload, $headers)
            ->assertStatus(200)
            ->assertJson([
                'id' => $id,
                'name' => 'Libri e Riviste UPDATE',
                'short' => 'libri UPDATE'
            ]);
    }

    public function testsCategoriesAreDeletedCorrectly()
    {

        $headers = ['Authorization' => "ajs8ebddau"];

        $id = 30;

        $payload = [
            'name' => 'Lorem',
            'short' => 'Ipsum',
        ];

        $category = new Category;
        $category->name = 'Libri e Riviste DEL';
        $category->short = 'libri DEL';
        $category->save();
        $id = $category->id;

        $response = $this->json('DELETE', '/api/categories/' . $id, $payload, $headers)
            ->assertStatus(200);
    }

    public function testCategoriesAreListedCorrectly()
    {
        $category = new Category;
        $category->name = 'Libri e Riviste first';
        $category->short = 'libri first';
        $category->save();

        $category = new Category;
        $category->name = 'Libri e Riviste second';
        $category->short = 'libri second';
        $category->save();

        $headers = ['Authorization' => "ajs8ebddau"];

        $response = $this->json('GET', '/api/categories', [], $headers)
            ->assertStatus(200)
            ->assertJson([
                [ 'name' => 'Libri e Riviste first', 'short' => 'libri first' ],
                [ 'name' => 'Libri e Riviste second', 'short' => 'libri second' ]
            ])
            ->assertJsonStructure([
                '*' => ['id', 'name', 'short', 'created_at', 'updated_at'],
            ]);
    }
}

In realtà la variabile $headers qui è superflua, ma mi viene comoda dopo, quando aggiungerò lo strato di autenticazione.

Eseguo i test

marcob@jsbach:shopping3$ composer test
> vendor/bin/phpunit
PHPUnit 7.4.0 by Sebastian Bergmann and contributors.

.....                                                               5 / 5 (100%)

Time: 248 ms, Memory: 16.00MB

OK (5 tests, 7 assertions)
marcob@jsbach:shopping3$ 

Il comando di test qui è dato utilizzando composer, in quanto ho definito uno script “test” all’interno del file di configurazione composer.json: alla sezione script ho aggiunto:

    "scripts": {
        ...
        "test" : [
            "vendor/bin/phpunit"
        ]
    },

L’alternativa è scrivere semplicemente vendor/bin/phpunit

Lascia un commento

Your email address will not be published.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.