Prologo
Primi Passi
Architettura
Le Basi
- Routing
- Middleware
- Protezione da CSRF
- Controller
- Richieste
- Risposte
- Views
- Blade
- Vite
- URL
- Sessioni
- Validazione
- Errori
- Logging
Approfondimenti
- Artisan
- Broadcasting
- Cache
- Collezioni
- Concorrenza
- Contesto
- Contratti
- Eventi
- File System
- Helpers
- Client HTTP
- Localizzazione
- Notifiche
- Sviluppo di Package
- Processi
- Code
- Rate-limiting
- Stringhe
- Scheduling di Task
Sicurezza
Database
Eloquent ORM
Testing
Package
Testing HTTP
- Introduzione
- Effettuare Richieste
- Test delle API JSON
- Testare il caricamento di file
- Testing Views
- Asserzioni Disponibili
- Affermazioni di Validazione
Introduzione
Laravel offre un’API molto fluida per effettuare richieste HTTP alla tua applicazione ed esaminare le risposte. Ad esempio, dai un’occhiata al test delle funzionalità definito di seguito:
<?php
test('the application returns a successful response', function () {
$response = $this->get('/');
$response->assertStatus(200);
});
<?php
namespace Tests\Feature;
use Tests\TestCase;
class ExampleTest extends TestCase
{
/**
* A basic test example.
*/
public function test_the_application_returns_a_successful_response(): void
{
$response = $this->get('/');
$response->assertStatus(200);
}
}
Il metodo get
effettua una richiesta GET
all’interno dell’applicazione, mentre il metodo assertStatus
verifica che la risposta restituita abbia il codice di stato HTTP dato. Oltre a questa semplice verifica, Laravel include una varietà di asserzioni per ispezionare gli header della risposta, il contenuto, la struttura JSON e altro ancora.
Effettuare Richieste
Per effettuare una richiesta alla tua applicazione, puoi utilizzare i metodi get
, post
, put
, patch
o delete
all’interno del tuo test. Questi metodi non inviano effettivamente una richiesta HTTP "reale" alla tua applicazione. Invece, l’intera richiesta di rete viene simulata internamente.
Invece di restituire un’istanza di Illuminate\Http\Response
, i metodi di richiesta nei test restituiscono un’istanza di Illuminate\Testing\TestResponse
, che fornisce una varietà di asserzioni utili che ti permettono di esaminare le risposte della tua applicazione:
<?php
test('basic request', function () {
$response = $this->get('/');
$response->assertStatus(200);
});
<?php
namespace Tests\Feature;
use Tests\TestCase;
class ExampleTest extends TestCase
{
/**
* Un esempio di test di base.
*/
public function test_a_basic_request(): void
{
$response = $this->get('/');
$response->assertStatus(200);
}
}
In generale, ogni test dovrebbe effettuare solo una richiesta alla tua applicazione. Potrebbero verificarsi comportamenti imprevisti se vengono eseguite più richieste all’interno di un singolo metodo di test.
Per comodità, il middleware CSRF è disabilitato automaticamente durante l’esecuzione dei test.
Personalizzare le Intestazioni delle Richieste
Puoi usare il metodo withHeaders
per personalizzare le intestazioni della richiesta prima che venga inviata all’applicazione. Questo metodo ti permette di aggiungere qualsiasi intestazione personalizzata desideri alla richiesta:
<?php
test('interacting with headers', function () {
$response = $this->withHeaders([
'X-Header' => 'Value',
])->post('/user', ['name' => 'Sally']);
$response->assertStatus(201);
});
<?php
namespace Tests\Feature;
use Tests\TestCase;
class ExampleTest extends TestCase
{
/**
* Un esempio di test funzionale di base.
*/
public function test_interacting_with_headers(): void
{
$response = $this->withHeaders([
'X-Header' => 'Value',
])->post('/user', ['name' => 'Sally']);
$response->assertStatus(201);
}
}
Cookies
Puoi utilizzare i metodi withCookie
o withCookies
per impostare i valori dei cookie prima di effettuare una richiesta. Il metodo withCookie
accetta il nome e il valore di un cookie come due argomenti, mentre il metodo withCookies
accetta un array di coppie nome/valore:
<?php
test('interacting with cookies', function () {
$response = $this->withCookie('color', 'blue')->get('/');
$response = $this->withCookies([
'color' => 'blue',
'name' => 'Taylor',
])->get('/');
//
});
<?php
namespace Tests\Feature;
use Tests\TestCase;
class ExampleTest extends TestCase
{
public function test_interacting_with_cookies(): void
{
$response = $this->withCookie('color', 'blue')->get('/');
$response = $this->withCookies([
'color' => 'blue',
'name' => 'Taylor',
])->get('/');
//
}
}
Sessione / Autenticazione
Laravel fornisce diversi helper per interagire con la sessione durante i test HTTP. Prima di tutto, puoi impostare i dati della sessione a un array specifico usando il metodo withSession
. Questo è utile per caricare la sessione con dati prima di effettuare una richiesta alla tua applicazione:
<?php
test('interacting with the session', function () {
$response = $this->withSession(['banned' => false])->get('/');
//
});
<?php
namespace Tests\Feature;
use Tests\TestCase;
class ExampleTest extends TestCase
{
public function test_interacting_with_the_session(): void
{
$response = $this->withSession(['banned' => false])->get('/');
//
}
}
La sessione di Laravel viene tipicamente utilizzata per mantenere lo stato dell’utente attualmente autenticato. Pertanto, il metodo helper actingAs
fornisce un modo semplice per autenticare un determinato utente come utente corrente. Ad esempio, possiamo usare una factory di modelli per generare e autenticare un utente:
<?php
use App\Models\User;
test('an action that requires authentication', function () {
$user = User::factory()->create();
$response = $this->actingAs($user)
->withSession(['banned' => false])
->get('/');
//
});
<?php
namespace Tests\Feature;
use App\Models\User;
use Tests\TestCase;
class ExampleTest extends TestCase
{
public function test_an_action_that_requires_authentication(): void
{
$user = User::factory()->create();
$response = $this->actingAs($user)
->withSession(['banned' => false])
->get('/');
//
}
}
Puoi anche specificare quale guardia deve essere utilizzata per autenticare l’utente fornito passando il nome della guardia come secondo argomento al metodo actingAs
. La guardia fornita al metodo actingAs
diventerà anche la guardia predefinita per tutta la durata del test:
$this->actingAs($user, 'web');
Debug delle Risposte
Dopo aver effettuato una richiesta di test alla tua applicazione, i metodi dump
, dumpHeaders
e dumpSession
possono essere utilizzati per esaminare e debuggarne il contenuto della risposta:
<?php
test('basic test', function () {
$response = $this->get('/');
$response->dumpHeaders();
$response->dumpSession();
$response->dump();
});
<?php
namespace Tests\Feature;
use Tests\TestCase;
class ExampleTest extends TestCase
{
/**
* Un esempio di test di base.
*/
public function test_basic_test(): void
{
$response = $this->get('/');
$response->dumpHeaders();
$response->dumpSession();
$response->dump();
}
}
In alternativa, puoi usare i metodi dd
, ddHeaders
e ddSession
per stampare le informazioni sulla risposta e poi fermare l’esecuzione:
<?php
test('basic test', function () {
$response = $this->get('/');
$response->ddHeaders();
$response->ddSession();
$response->dd();
});
<?php
namespace Tests\Feature;
use Tests\TestCase;
class ExampleTest extends TestCase
{
/**
* Un esempio di test di base.
*/
public function test_basic_test(): void
{
$response = $this->get('/');
$response->ddHeaders();
$response->ddSession();
$response->dd();
}
}
Gestione delle Eccezioni
A volte potresti aver bisogno di verificare che la tua applicazione lanci una specifica eccezione. Per fare ciò, puoi "falsificare" il gestore delle eccezioni tramite il facade Exceptions
. Una volta falsificato il gestore delle eccezioni, puoi utilizzare i metodi assertReported
e assertNotReported
per fare delle asserzioni sulle eccezioni che sono state lanciate durante la richiesta:
<?php
use App\Exceptions\InvalidOrderException;
use Illuminate\Support\Facades\Exceptions;
test('exception is thrown', function () {
Exceptions::fake();
$response = $this->get('/order/1');
// Assert an exception was thrown...
Exceptions::assertReported(InvalidOrderException::class);
// Assert against the exception...
Exceptions::assertReported(function (InvalidOrderException $e) {
return $e->getMessage() === 'The order was invalid.';
});
});
<?php
namespace Tests\Feature;
use App\Exceptions\InvalidOrderException;
use Illuminate\Support\Facades\Exceptions;
use Tests\TestCase;
class ExampleTest extends TestCase
{
/**
* Un esempio di test di base.
*/
public function test_exception_is_thrown(): void
{
Exceptions::fake();
$response = $this->get('/');
// Assert an exception was thrown...
Exceptions::assertReported(InvalidOrderException::class);
// Assert against the exception...
Exceptions::assertReported(function (InvalidOrderException $e) {
return $e->getMessage() === 'The order was invalid.';
});
}
}
I metodi assertNotReported
e assertNothingReported
possono essere utilizzati per verificare che una determinata eccezione non sia stata lanciata durante la richiesta o che nessuna eccezione sia stata lanciata:
Exceptions::assertNotReported(InvalidOrderException::class);
Exceptions::assertNothingReported();
Puoi disabilitare completamente la gestione delle eccezioni per una determinata richiesta invocando il metodo withoutExceptionHandling
prima di effettuare la tua richiesta:
$response = $this->withoutExceptionHandling()->get('/');
Inoltre, se desideri assicurarti che la tua applicazione non utilizzi funzionalità deprecate dal linguaggio PHP o dalle librerie che la tua applicazione utilizza, puoi invocare il metodo withoutDeprecationHandling
prima di effettuare la tua richiesta. Quando la gestione delle deprecazioni è disabilitata, gli avvisi di deprecazione verranno convertiti in eccezioni, causando così il fallimento del tuo test:
$response = $this->withoutDeprecationHandling()->get('/');
Il metodo assertThrows
può essere utilizzato per verificare che un determinato blocco di codice lanci un’eccezione del tipo specificato:
$this->assertThrows(
fn () => (new ProcessOrder)->execute(),
OrderInvalid::class
);
Se desideri ispezionare e fare delle asserzioni sull’eccezione lanciata, puoi fornire una closure come secondo argomento al metodo assertThrows
:
$this->assertThrows(
fn () => (new ProcessOrder)->execute(),
fn (OrderInvalid $e) => $e->orderId() === 123;
);
Test delle API JSON
Laravel fornisce anche diversi helper per testare le API JSON e le loro risposte. Ad esempio, i metodi json
, getJson
, postJson
, putJson
, patchJson
, deleteJson
e optionsJson
possono essere usati per inviare richieste JSON con vari verbi HTTP. Puoi anche passare facilmente dati e intestazioni a questi metodi. Per iniziare, scriviamo un test per effettuare una richiesta POST
a /api/user
e verificare che i dati JSON attesi siano stati restituiti:
<?php
test('making an api request', function () {
$response = $this->postJson('/api/user', ['name' => 'Sally']);
$response
->assertStatus(201)
->assertJson([
'created' => true,
]);
});
<?php
namespace Tests\Feature;
use Tests\TestCase;
class ExampleTest extends TestCase
{
/**
* Un esempio di test funzionale di base.
*/
public function test_making_an_api_request(): void
{
$response = $this->postJson('/api/user', ['name' => 'Sally']);
$response
->assertStatus(201)
->assertJson([
'created' => true,
]);
}
}
Inoltre, i dati della risposta JSON possono essere accessi come variabili array sulla risposta, rendendo comodo ispezionare i singoli valori restituiti all’interno di una risposta JSON:
expect($response['created'])->toBeTrue();
$this->assertTrue($response['created']);
Il metodo
assertJson
converte la risposta in un array per verificare che l’array dato esista all’interno della risposta JSON restituita dall’applicazione. Quindi, se ci sono altre proprietà nella risposta JSON, questo test passerà comunque fintanto che il frammento dato è presente.
Verificare Esattamente le Corrispondenze JSON
Come menzionato in precedenza, il metodo assertJson
può essere utilizzato per verificare che un frammento di JSON esista all’interno della risposta JSON. Se desideri controllare che un array corrisponda esattamente al JSON restituito dalla tua applicazione, dovresti usare il metodo assertExactJson
:
<?php
test('asserting an exact json match', function () {
$response = $this->postJson('/user', ['name' => 'Sally']);
$response
->assertStatus(201)
->assertExactJson([
'created' => true,
]);
});
<?php
namespace Tests\Feature;
use Tests\TestCase;
class ExampleTest extends TestCase
{
/**
* Un esempio di test funzionale di base.
*/
public function test_asserting_an_exact_json_match(): void
{
$response = $this->postJson('/user', ['name' => 'Sally']);
$response
->assertStatus(201)
->assertExactJson([
'created' => true,
]);
}
}
Verificare i percorsi JSON
Se vuoi controllare che la risposta JSON contenga determinati dati in un percorso specifico, usa il metodo assertJsonPath
:
<?php
test('asserting a json path value', function () {
$response = $this->postJson('/user', ['name' => 'Sally']);
$response
->assertStatus(201)
->assertJsonPath('team.owner.name', 'Darian');
});
<?php
namespace Tests\Feature;
use Tests\TestCase;
class ExampleTest extends TestCase
{
/**
* Un esempio di test funzionale di base.
*/
public function test_asserting_a_json_paths_value(): void
{
$response = $this->postJson('/user', ['name' => 'Sally']);
$response
->assertStatus(201)
->assertJsonPath('team.owner.name', 'Darian');
}
}
Il metodo assertJsonPath
accetta anche una closure, che può essere utilizzata per determinare dinamicamente se l’asserzione deve passare:
$response->assertJsonPath('team.owner.name', fn (string $name) => strlen($name) >= 3);
Test Fluent di JSON
Laravel offre anche un modo semplice per testare fluentemente le risposte JSON della tua applicazione. Per iniziare, passa una closure al metodo assertJson
. Questa closure verrà invocata con un’istanza di Illuminate\Testing\Fluent\AssertableJson
che può essere utilizzata per effettuare asserzioni sul JSON restituito dalla tua applicazione. Il metodo where
può essere usato per fare asserzioni su un attributo particolare del JSON, mentre il metodo missing
può essere utilizzato per affermare che un attributo specifico è mancante nel JSON:
use Illuminate\Testing\Fluent\AssertableJson;
test('fluent json', function () {
$response = $this->getJson('/users/1');
$response
->assertJson(fn (AssertableJson $json) =>
$json->where('id', 1)
->where('name', 'Victoria Faith')
->where('email', fn (string $email) => str($email)->is('victoria@gmail.com'))
->whereNot('status', 'pending')
->missing('password')
->etc()
);
});
use Illuminate\Testing\Fluent\AssertableJson;
/**
* Un esempio di test funzionale di base.
*/
public function test_fluent_json(): void
{
$response = $this->getJson('/users/1');
$response
->assertJson(fn (AssertableJson $json) =>
$json->where('id', 1)
->where('name', 'Victoria Faith')
->where('email', fn (string $email) => str($email)->is('victoria@gmail.com'))
->whereNot('status', 'pending')
->missing('password')
->etc()
);
}
Comprendere il metodo etc
Nell’esempio sopra, potresti aver notato che abbiamo invocato il metodo etc
alla fine della nostra catena di asserzioni. Questo metodo informa Laravel che potrebbero esserci altri attributi presenti nell’oggetto JSON. Se il metodo etc
non viene utilizzato, il test fallirà se esistono altri attributi nell’oggetto JSON su cui non hai fatto asserzioni.
L’intento di questo comportamento è proteggerti dall’esposizione involontaria di informazioni sensibili nelle tue risposte JSON, costringendoti a fare esplicitamente un’asserzione sull’attributo o a permettere esplicitamente attributi aggiuntivi tramite il metodo etc
.
Tuttavia, devi essere consapevole che non includere il metodo etc
nella tua catena di asserzioni non garantisce che non vengano aggiunti attributi aggiuntivi agli array annidati all’interno del tuo oggetto JSON. Il metodo etc
assicura solo che non esistano attributi aggiuntivi al livello di annidamento in cui viene invocato.
Verificare la Presenza / Assenza di Attributi
Per verificare che un attributo sia presente o assente, puoi usare i metodi has
e missing
:
$response->assertJson(fn (AssertableJson $json) =>
$json->has('data')
->missing('message')
);
Inoltre, i metodi hasAll
e missingAll
permettono di verificare la presenza o l’assenza di più attributi contemporaneamente:
$response->assertJson(fn (AssertableJson $json) =>
$json->hasAll(['status', 'data'])
->missingAll(['message', 'code'])
);
Puoi usare il metodo hasAny
per determinare se almeno uno degli attributi di una lista è presente:
$response->assertJson(fn (AssertableJson $json) =>
$json->has('status')
->hasAny('data', 'message', 'code')
);
Verificare Collezioni JSON
Spesso, una tua route restituisce una risposta JSON con più elementi, ad esempio più utenti:
Route::get('/users', function () {
return User::all();
});
In questi casi, possiamo usare il metodo has
dell’oggetto JSON fluente per fare asserzioni sugli utenti presenti nella risposta. Ad esempio, verifichiamo che la risposta JSON contenga tre utenti. Successivamente, faremo alcune asserzioni sul primo utente della collezione usando il metodo first
. Il metodo first
accetta una closure che riceve un’altra stringa JSON asseribile, che possiamo usare per fare asserzioni sul primo oggetto nella collezione JSON:
$response
->assertJson(fn (AssertableJson $json) =>
$json->has(3)
->first(fn (AssertableJson $json) =>
$json->where('id', 1)
->where('name', 'Victoria Faith')
->where('email', fn (string $email) => str($email)->is('victoria@gmail.com'))
->missing('password')
->etc()
)
);
Limitare le asserzioni sulle collezioni JSON
A volte, le rotte della tua applicazione restituiscono collezioni JSON con chiavi assegnate:
Route::get('/users', function () {
return [
'meta' => [...],
'users' => User::all(),
];
})
Quando testi queste rotte, puoi usare il metodo has
per verificare il numero di elementi nella collezione. Inoltre, puoi usare il metodo has
per limitare una catena di asserzioni:
$response
->assertJson(fn (AssertableJson $json) =>
$json->has('meta')
->has('users', 3)
->has('users.0', fn (AssertableJson $json) =>
$json->where('id', 1)
->where('name', 'Victoria Faith')
->where('email', fn (string $email) => str($email)->is('victoria@gmail.com'))
->missing('password')
->etc()
)
);
Tuttavia, invece di fare due chiamate separate al metodo has
per verificare la collezione users
, puoi fare una sola chiamata che fornisce una closure come terzo parametro. In questo modo, la closure verrà automaticamente invocata e limitata al primo elemento della collezione:
$response
->assertJson(fn (AssertableJson $json) =>
$json->has('meta')
->has('users', 3, fn (AssertableJson $json) =>
$json->where('id', 1)
->where('name', 'Victoria Faith')
->where('email', fn (string $email) => str($email)->is('victoria@gmail.com'))
->missing('password')
->etc()
)
);
Asserzione dei Tipi JSON
Potresti voler verificare solo che le proprietà nella risposta JSON siano di un certo tipo. La classe Illuminate\Testing\Fluent\AssertableJson
fornisce i metodi whereType
e whereAllType
per fare proprio questo:
$response->assertJson(fn (AssertableJson $json) =>
$json->whereType('id', 'integer')
->whereAllType([
'users.0.name' => 'string',
'meta' => 'array'
])
);
Puoi specificare più tipi usando il carattere |
, oppure passando un array di tipi come secondo parametro al metodo whereType
. L’asserzione avrà successo se il valore della risposta è uno dei tipi elencati:
$response->assertJson(fn (AssertableJson $json) =>
$json->whereType('name', 'string|null')
->whereType('id', ['string', 'integer'])
);
I metodi whereType
e whereAllType
riconoscono i seguenti tipi: string
, integer
, double
, boolean
, array
e null
.
Testare il caricamento di file
La classe Illuminate\Http\UploadedFile
fornisce un metodo fake
che può essere utilizzato per generare file o immagini fittizi per il testing. Questo, combinato con il metodo fake
del facade Storage
, semplifica notevolmente i test di caricamento dei file. Ad esempio, puoi combinare queste due funzionalità per testare facilmente un modulo di caricamento dell’avatar:
<?php
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
test('avatars can be uploaded', function () {
Storage::fake('avatars');
$file = UploadedFile::fake()->image('avatar.jpg');
$response = $this->post('/avatar', [
'avatar' => $file,
]);
Storage::disk('avatars')->assertExists($file->hashName());
});
<?php
namespace Tests\Feature;
use Illuminate\Http\UploadedFile;
use Illuminate\Support\Facades\Storage;
use Tests\TestCase;
class ExampleTest extends TestCase
{
public function test_avatars_can_be_uploaded(): void
{
Storage::fake('avatars');
$file = UploadedFile::fake()->image('avatar.jpg');
$response = $this->post('/avatar', [
'avatar' => $file,
]);
Storage::disk('avatars')->assertExists($file->hashName());
}
}
Se desideri verificare che un determinato file non esista, puoi utilizzare il metodo assertMissing
fornito dal facade Storage
:
Storage::fake('avatars');
// ...
Storage::disk('avatars')->assertMissing('missing.jpg');
Personalizzazione di File Fake
Quando crei file usando il metodo fake
fornito dalla classe UploadedFile
, puoi specificare la larghezza, l’altezza e la dimensione dell’immagine (in kilobyte) per testare meglio le regole di validazione della tua applicazione:
UploadedFile::fake()->image('avatar.jpg', $width, $height)->size(100);
Oltre a creare immagini, puoi creare file di qualsiasi altro tipo usando il metodo create
:
UploadedFile::fake()->create('document.pdf', $sizeInKilobytes);
Se necessario, puoi passare un argomento $mimeType
al metodo per definire esplicitamente il tipo MIME che il file dovrebbe restituire:
UploadedFile::fake()->create(
'document.pdf', $sizeInKilobytes, 'application/pdf'
);
Testing Views
Laravel permette anche di renderizzare una view senza effettuare una richiesta HTTP simulata all’applicazione. Per fare ciò, puoi chiamare il metodo view
all’interno del tuo test. Il metodo view
accetta il nome della view e un array opzionale di dati. Il metodo restituisce un’istanza di Illuminate\Testing\TestView
, che offre diversi metodi per effettuare facilmente asserzioni sul contenuto della view:
<?php
test('a welcome view can be rendered', function () {
$view = $this->view('welcome', ['name' => 'Taylor']);
$view->assertSee('Taylor');
});
<?php
namespace Tests\Feature;
use Tests\TestCase;
class ExampleTest extends TestCase
{
public function test_a_welcome_view_can_be_rendered(): void
{
$view = $this->view('welcome', ['name' => 'Taylor']);
$view->assertSee('Taylor');
}
}
La classe TestView
fornisce i seguenti metodi di asserzione: assertSee
, assertSeeInOrder
, assertSeeText
, assertSeeTextInOrder
, assertDontSee
e assertDontSeeText
.
Se necessario, puoi ottenere il contenuto grezzo e renderizzato della view convertendo l’istanza di TestView
in una stringa:
$contents = (string) $this->view('welcome');
Condivisione degli errori
Alcune viste potrebbero dipendere dagli errori condivisi nel global error bag fornito da Laravel. Per popolare l’error bag con i messaggi di errore, puoi usare il metodo withViewErrors
:
$view = $this->withViewErrors([
'name' => ['Please provide a valid name.']
])->view('form');
$view->assertSee('Please provide a valid name.');
Rendering Blade e Componenti
Se necessario, puoi usare il metodo blade
per valutare e renderizzare una stringa Blade grezza. Come il metodo view
, il metodo blade
restituisce una istanza di Illuminate\Testing\TestView
:
$view = $this->blade(
'<x-component :name="$name" />',
['name' => 'Taylor']
);
$view->assertSee('Taylor');
Puoi usare il metodo component
per valutare e renderizzare un Blade component. Il metodo component
restituisce una istanza di Illuminate\Testing\TestComponent
:
$view = $this->component(Profile::class, ['name' => 'Taylor']);
$view->assertSee('Taylor');
Asserzioni Disponibili
Assert di Risposta
La classe Illuminate\Testing\TestResponse
di Laravel fornisce una varietà di metodi di assert personalizzati che puoi utilizzare quando testi la tua applicazione. Questi assert possono essere utilizzati sulla risposta restituita dai metodi di test json
, get
, post
, put
e delete
:
- assertAccepted
- assertBadRequest
- assertConflict
- assertCookie
- assertCookieExpired
- assertCookieNotExpired
- assertCookieMissing
- assertCreated
- assertDontSee
- assertDontSeeText
- assertDownload
- assertExactJson
- assertExactJsonStructure
- assertForbidden
- assertFound
- assertGone
- assertHeader
- assertHeaderMissing
- assertInternalServerError
- assertJson
- assertJsonCount
- assertJsonFragment
- assertJsonIsArray
- assertJsonIsObject
- assertJsonMissing
- assertJsonMissingExact
- assertJsonMissingValidationErrors
- assertJsonPath
- assertJsonMissingPath
- assertJsonStructure
- assertJsonValidationErrors
- assertJsonValidationErrorFor
- assertLocation
- assertMethodNotAllowed
- assertMovedPermanently
- assertContent
- assertNoContent
- assertStreamedContent
- assertNotFound
- assertOk
- assertPaymentRequired
- assertPlainCookie
- assertRedirect
- assertRedirectContains
- assertRedirectToRoute
- assertRedirectToSignedRoute
- assertRequestTimeout
- assertSee
- assertSeeInOrder
- assertSeeText
- assertSeeTextInOrder
- assertServerError
- assertServiceUnavailable
- assertSessionHas
- assertSessionHasInput
- assertSessionHasAll
- assertSessionHasErrors
- assertSessionHasErrorsIn
- assertSessionHasNoErrors
- assertSessionDoesntHaveErrors
- assertSessionMissing
- assertStatus
- assertSuccessful
- assertTooManyRequests
- assertUnauthorized
- assertUnprocessable
- assertUnsupportedMediaType
- assertValid
- assertInvalid
- assertViewHas
- assertViewHasAll
- assertViewIs
- assertViewMissing
assertBadRequest
Verifica che la risposta abbia un codice di stato HTTP bad request (400):
$response->assertBadRequest();
assertAccepted
Verifica che la risposta abbia lo stato HTTP accepted (202):
$response->assertAccepted();
assertConflict
Verifica che la risposta abbia il codice di stato HTTP 409 (conflitto):
$response->assertConflict();
assertCookie
Verifica che la risposta contenga il cookie indicato:
$response->assertCookie($cookieName, $value = null);
assertCookieExpired
Verifica che la risposta contenga il cookie specificato e che sia scaduto:
$response->assertCookieExpired($cookieName);
assertCookieNotExpired
Verifica che la risposta contenga il cookie specificato e che non sia scaduto:
$response->assertCookieNotExpired($cookieName);
assertCookieMissing
Verifica che la risposta non contenga il cookie specificato:
$response->assertCookieMissing($cookieName);
assertCreated
Verifica che la risposta abbia un codice di stato HTTP 201:
$response->assertCreated();
assertDontSee
Verifica che la stringa fornita non sia presente nella risposta restituita dall’applicazione. Questa asserzione eseguirà automaticamente l’escape della stringa a meno che non passi un secondo argomento con valore false
:
$response->assertDontSee($value, $escaped = true);
assertDontSeeText
Verifica che la stringa fornita non sia presente nel testo della risposta. Questa asserzione scapperà automaticamente la stringa a meno che non passi un secondo argomento false
. Questo metodo passa il contenuto della risposta alla funzione PHP strip_tags
prima di effettuare l’asserzione:
$response->assertDontSeeText($value, $escaped = true);
assertDownload
Verifica che la risposta sia un "download". Di solito, ciò significa che la rotta invocata che ha restituito la risposta ha restituito una Response::download
, BinaryFileResponse
o Storage::download
:
$response->assertDownload();
Se vuoi, puoi verificare che il file scaricabile abbia ricevuto un determinato nome:
$response->assertDownload('image.jpg');
assertExactJson
Verifica che la risposta contenga una corrispondenza esatta dei dati JSON forniti:
$response->assertExactJson(array $data);
assertExactJsonStructure
Asserisci che la risposta contenga una corrispondenza esatta della struttura JSON fornita:
$response->assertExactJsonStructure(array $data);
Questo metodo è una variante più rigorosa di assertJsonStructure. A differenza di assertJsonStructure
, questo metodo fallirà se la risposta contiene chiavi che non sono esplicitamente incluse nella struttura JSON prevista.
assertForbidden
Verifica che la risposta abbia un codice di stato HTTP proibito (403):
$response->assertForbidden();
assertFound
Verifica che la risposta abbia un codice di stato HTTP found (302):
$response->assertFound();
assertGone
Verifica che la risposta abbia un codice di stato HTTP "gone" (410):
$response->assertGone();
assertHeader
Verifica che l’header e il valore specificati siano presenti nella risposta:
$response->assertHeader($headerName, $value = null);
assertHeaderMissing
Verifica che l’intestazione specificata non sia presente nella risposta:
$response->assertHeaderMissing($headerName);
assertInternalServerError
Verifica che la risposta abbia un codice di stato HTTP "Internal Server Error" (500):
$response->assertInternalServerError();
assertJson
Verifica che la risposta contenga i dati JSON specificati:
$response->assertJson(array $data, $strict = false);
Il metodo assertJson
converte la risposta in un array per verificare che l’array fornito esista all’interno della risposta JSON restituita dall’applicazione. Quindi, se ci sono altre proprietà nella risposta JSON, questo test passerà comunque a condizione che il frammento fornito sia presente.
assertJsonCount
Verifica che il JSON della risposta contenga un array con il numero previsto di elementi alla chiave specificata:
$response->assertJsonCount($count, $key = null);
assertJsonFragment
Verifica che la risposta contenga i dati JSON specificati in qualsiasi parte della risposta:
Route::get('/users', function () {
return [
'users' => [
[
'name' => 'Taylor Otwell',
],
],
];
});
$response->assertJsonFragment(['name' => 'Taylor Otwell']);
assertJsonIsArray
Verifica che il JSON della risposta sia un array:
$response->assertJsonIsArray();
assertJsonIsObject
Verifica che il JSON della risposta sia un oggetto:
$response->assertJsonIsObject();
assertJsonMissing
Verifica che la risposta non includa i dati JSON forniti:
$response->assertJsonMissing(array $data);
assertJsonMissingExact
Verifica che la risposta non contenga esattamente i dati JSON:
$response->assertJsonMissingExact(array $data);
assertJsonMissingValidationErrors
Verifica che la risposta non abbia errori di validazione JSON per le chiavi specificate:
$response->assertJsonMissingValidationErrors($keys);
Il metodo più generico assertValid può essere usato per verificare che una risposta non abbia errori di validazione restituiti come JSON e che nessun errore sia stato salvato nella sessione.
assertJsonPath
Verifica che la risposta contenga i dati specificati nel percorso indicato:
$response->assertJsonPath($path, $expectedValue);
Ad esempio, se la tua applicazione restituisce la seguente risposta JSON:
{
"user": {
"name": "Steve Schoger"
}
}
Puoi verificare che la proprietà name
dell’oggetto user
corrisponda a un valore specifico in questo modo:
$response->assertJsonPath('user.name', 'Steve Schoger');
assertJsonMissingPath
Verifica che la risposta non contenga il percorso specificato:
$response->assertJsonMissingPath($path);
Per esempio, se la tua applicazione restituisce la seguente risposta JSON:
{
"user": {
"name": "Steve Schoger"
}
}
Puoi verificare che non contenga la proprietà email
dell’oggetto user
:
$response->assertJsonMissingPath('user.email');
assertJsonStructure
Verifica che la risposta abbia una determinata struttura JSON:
$response->assertJsonStructure(array $structure);
Ad esempio, se la risposta JSON restituita dalla tua applicazione contiene i seguenti dati:
{
"user": {
"name": "Steve Schoger"
}
}
Puoi verificare che la struttura JSON corrisponda alle tue aspettative in questo modo:
$response->assertJsonStructure([
'user' => [
'name',
]
]);
A volte, le risposte JSON restituite dalla tua applicazione possono contenere array di oggetti:
{
"user": [
{
"name": "Steve Schoger",
"age": 55,
"location": "Earth"
},
{
"name": "Mary Schoger",
"age": 60,
"location": "Earth"
}
]
}
In questa situazione, puoi usare il carattere *
per verificare la struttura di tutti gli oggetti nell’array:
$response->assertJsonStructure([
'user' => [
'*' => [
'name',
'age',
'location'
]
]
]);
assertJsonValidationErrors
Assicurati che la risposta contenga gli errori di validazione JSON specificati per le chiavi date. Questo metodo va utilizzato quando si verificano risposte in cui gli errori di validazione vengono restituiti come struttura JSON invece di essere memorizzati nella sessione:
$response->assertJsonValidationErrors(array $data, $responseKey = 'errors');
Il metodo più generico assertInvalid può essere usato per verificare che una risposta contenga errori di validazione restituiti come JSON o che gli errori siano stati memorizzati nella sessione.
assertJsonValidationErrorFor
Controlla che la risposta contenga errori di validazione JSON per la chiave specificata:
$response->assertJsonValidationErrorFor(string $key, $responseKey = 'errors');
assertMethodNotAllowed
Verifica che la risposta abbia un codice di stato HTTP metodo non consentito (405):
$response->assertMethodNotAllowed();
assertMovedPermanently
Verifica che la risposta abbia un codice di stato HTTP spostato permanentemente (301):
$response->assertMovedPermanently();
assertLocation
Verifica che la risposta contenga il valore URI specificato nell’intestazione Location
:
$response->assertLocation($uri);
assertContent
Verifica che la stringa fornita corrisponda al contenuto della risposta:
$response->assertContent($value);
assertNoContent
Verifica che la risposta abbia il codice di stato HTTP specificato e nessun contenuto:
$response->assertNoContent($status = 204);
assertStreamedContent
Verifica che la stringa fornita corrisponda al contenuto della risposta in streaming:
$response->assertStreamedContent($value);
assertNotFound
Verifica che la risposta abbia un codice di stato HTTP non trovato (404):
$response->assertNotFound();
assertOk
Verifica che la risposta abbia un codice di stato HTTP 200:
$response->assertOk();
assertPaymentRequired
Verifica che la risposta abbia un codice di stato HTTP "Pagamento Richiesto" (402):
$response->assertPaymentRequired();
assertPlainCookie
Verifica che la risposta contenga il cookie non criptato specificato:
$response->assertPlainCookie($cookieName, $value = null);
assertRedirect
Verifica che la risposta sia un redirect all’URI fornito:
$response->assertRedirect($uri = null);
assertRedirectContains
Controlla se la risposta reindirizza a un URI che include la stringa specificata:
$response->assertRedirectContains($string);
assertRedirectToRoute
Verifica che la risposta sia un reindirizzamento alla named route specificata:
$response->assertRedirectToRoute($name, $parameters = []);
assertRedirectToSignedRoute
Verifica che la risposta sia un reindirizzamento alla signed route specificata:
$response->assertRedirectToSignedRoute($name = null, $parameters = []);
assertRequestTimeout
Verifica che la risposta abbia un codice di stato HTTP di timeout della richiesta (408):
$response->assertRequestTimeout();
assertSee
Controlla che la stringa fornita sia presente nella risposta. Questa verifica eseguirà automaticamente l’escape della stringa a meno che non passi un secondo argomento false
:
$response->assertSee($value, $escaped = true);
assertSeeInOrder
Verifica che le stringhe fornite siano presenti nell’ordine corretto nella risposta. Questa asserzione effettuerà automaticamente l’escape delle stringhe, a meno che non passi un secondo argomento di false
:
$response->assertSeeInOrder(array $values, $escaped = true);
assertSeeText
Verifica che la stringa fornita sia presente nel testo della risposta. Questa asserzione esegue automaticamente l’escape della stringa, a meno che non passi un secondo argomento come false
. Il contenuto della risposta viene passato alla funzione PHP strip_tags
prima di effettuare l’asserzione:
$response->assertSeeText($value, $escaped = true);
assertSeeTextInOrder
Verifica che le stringhe fornite siano presenti nell’ordine nel testo della risposta. Questa asserzione esegue automaticamente l’escape delle stringhe a meno che non passi un secondo argomento di false
. Il contenuto della risposta verrà passato alla funzione PHP strip_tags
prima che l’asserzione venga eseguita:
$response->assertSeeTextInOrder(array $values, $escaped = true);
assertServerError
Verifica che la risposta abbia un codice di stato HTTP di errore server (>= 500 e < 600):
$response->assertServerError();
assertServiceUnavailable
Verifica che la risposta abbia un codice di stato HTTP "Servizio non disponibile" (503):
$response->assertServiceUnavailable();
assertSessionHas
Verifica che la sessione contenga il dato specificato:
$response->assertSessionHas($key, $value = null);
Se necessario, puoi fornire una closure come secondo argomento al metodo assertSessionHas
. L’asserzione avrà successo se la closure restituisce true
:
$response->assertSessionHas($key, function (User $value) {
return $value->name === 'Taylor Otwell';
});
assertSessionHasInput
Verifica che la sessione contenga un determinato valore nell’ array di input flashed:
$response->assertSessionHasInput($key, $value = null);
Se necessario, puoi fornire una closure come secondo argomento al metodo assertSessionHasInput
. L’asserzione sarà valida se la closure restituisce true
:
use Illuminate\Support\Facades\Crypt;
$response->assertSessionHasInput($key, function (string $value) {
return Crypt::decryptString($value) === 'secret';
});
assertSessionHasAll
Verifica che la sessione contenga un array specificato di coppie chiave/valore:
$response->assertSessionHasAll(array $data);
Ad esempio, se la sessione della tua applicazione contiene le chiavi name
e status
, puoi verificare che entrambe esistano e abbiano i valori specificati in questo modo:
$response->assertSessionHasAll([
'name' => 'Taylor Otwell',
'status' => 'active',
]);
assertSessionHasErrors
Verifica che la sessione contenga un errore per le $keys
fornite. Se $keys
è un array associativo, verifica che la sessione contenga un messaggio di errore specifico (valore) per ogni campo (chiave). Questo metodo dovrebbe essere usato quando si testano le rotte che inviano errori di validazione alla sessione anziché restituirli come struttura JSON:
$response->assertSessionHasErrors(
array $keys = [], $format = null, $errorBag = 'default'
);
Ad esempio, per verificare che i campi name
ed email
abbiano messaggi di errore di validazione inviati alla sessione, puoi chiamare il metodo assertSessionHasErrors
così:
$response->assertSessionHasErrors(['name', 'email']);
Oppure, puoi verificare che un determinato campo abbia un particolare messaggio di errore di validazione:
$response->assertSessionHasErrors([
'name' => 'The given name was invalid.'
]);
Il metodo più generico assertInvalid può essere usato per verificare che una risposta abbia errori di validazione restituiti come JSON o che gli errori siano stati inviati alla sessione.
assertSessionHasErrorsIn
Verifica che la sessione contenga un errore per le $keys
specificate all’interno di uno error bag. Se $keys
è un array associativo, controlla che la sessione abbia un messaggio di errore specifico (valore) per ogni campo (chiave) all’interno dell’error bag:
$response->assertSessionHasErrorsIn($errorBag, $keys = [], $format = null);
assertSessionHasNoErrors
Verifica che la sessione non abbia errori di validazione:
$response->assertSessionHasNoErrors();
assertSessionDoesntHaveErrors
Verifica che la sessione non abbia errori di validazione per le chiavi fornite:
$response->assertSessionDoesntHaveErrors($keys = [], $format = null, $errorBag = 'default');
Il metodo più generico assertValid può essere utilizzato per verificare che una risposta non abbia errori di validazione restituiti come JSON e che nessun errore sia stato memorizzato nella sessione.
assertSessionMissing
Verifica che la sessione non contenga la chiave specificata:
$response->assertSessionMissing($key);
assertStatus
Verifica che la risposta abbia un determinato codice di stato HTTP:
$response->assertStatus($code);
assertSuccessful
Verifica che la risposta abbia un codice di stato HTTP di successo (>= 200 e < 300):
$response->assertSuccessful();
assertTooManyRequests
Verifica che la risposta abbia lo status code HTTP "too many requests" (429):
$response->assertTooManyRequests();
assertUnauthorized
Verifica che la risposta abbia un codice di stato HTTP non autorizzato (401):
$response->assertUnauthorized();
assertUnprocessable
Verifica che la risposta abbia un codice di stato HTTP "unprocessable entity" (422):
$response->assertUnprocessable();
assertUnsupportedMediaType
Verifica che la risposta abbia un tipo di media non supportato (codice di stato HTTP 415):
$response->assertUnsupportedMediaType();
assertValid
Verifica che la risposta non abbia errori di validazione per le chiavi specificate. Questo metodo può essere usato per verificare risposte in cui gli errori di validazione sono restituiti come struttura JSON o dove gli errori di validazione sono stati salvati nella sessione:
// Verifica che non ci siano errori di validazione...
$response->assertValid();
// Verifica che le chiavi specificate non abbiano errori di validazione...
$response->assertValid(['name', 'email']);
assertInvalid
Verifica che la risposta contenga errori di validazione per le chiavi specificate. Questo metodo può essere utilizzato per controllare risposte in cui gli errori di validazione vengono restituiti come struttura JSON o quando sono stati salvati nella sessione:
$response->assertInvalid(['name', 'email']);
Puoi anche verificare che una determinata chiave abbia un messaggio di errore di validazione specifico. In questo caso, puoi fornire l’intero messaggio o solo una parte:
$response->assertInvalid([
'name' => 'The name field is required.',
'email' => 'valid email address',
]);
assertViewHas
Verifica che la vista della risposta contenga un determinato dato:
$response->assertViewHas($key, $value = null);
Passare una closure come secondo argomento al metodo assertViewHas
ti permette di ispezionare e fare asserzioni su un particolare dato della vista:
$response->assertViewHas('user', function (User $user) {
return $user->name === 'Taylor';
});
Inoltre, i dati della vista possono essere accessibili come variabili array sulla risposta, permettendoti di ispezionarli comodamente:
php tab=Pest
expect($response['name'])->toBe('Taylor');
tab=PHPUnit
$this->assertEquals('Taylor', $response['name']);
assertViewHasAll
Verifica che la view della risposta contenga una lista specificata di dati:
$response->assertViewHasAll(array $data);
Questo metodo può essere utilizzato per verificare che la view contenga semplicemente dati corrispondenti alle chiavi specificate:
$response->assertViewHasAll([
'name',
'email',
]);
Oppure, puoi verificare che i dati della view siano presenti e abbiano valori specifici:
$response->assertViewHasAll([
'name' => 'Taylor Otwell',
'email' => 'taylor@example.com,',
]);
assertViewIs
Assicurati che la vista specificata sia stata restituita dalla route:
$response->assertViewIs($value);
assertViewMissing
Verifica che la chiave dei dati specificata non sia disponibile nella vista restituita dalla risposta dell’applicazione:
$response->assertViewMissing($key);
Assunzioni di Autenticazione
Laravel fornisce anche una varietà di asserzioni relative all’autenticazione che puoi utilizzare nei test delle funzionalità della tua applicazione. Nota che questi metodi vengono invocati direttamente sulla classe di test e non sull’istanza Illuminate\Testing\TestResponse
restituita da metodi come get
e post
.
assertAuthenticated
Verifica se un utente è autenticato:
$this->assertAuthenticated($guard = null);
assertGuest
Verifica che un utente non sia autenticato:
$this->assertGuest($guard = null);
assertAuthenticatedAs
Verifica che un utente specifico sia autenticato:
$this->assertAuthenticatedAs($user, $guard = null);
Affermazioni di Validazione
Laravel offre due principali affermazioni relative alla validazione che puoi usare per assicurarti che i dati forniti nella tua richiesta siano validi o invalidi.
assertValid
Verifica che la risposta non abbia errori di validazione per le chiavi specificate. Questo metodo può essere usato per controllare risposte dove gli errori di validazione sono restituiti come struttura JSON o dove gli errori di validazione sono stati memorizzati nella sessione:
// Verifica che non siano presenti errori di validazione...
$response->assertValid();
// Verifica che le chiavi specificate non abbiano errori di validazione...
$response->assertValid(['name', 'email']);
assertInvalid
Verifica che la risposta contenga errori di validazione per le chiavi specificate. Questo metodo può essere utilizzato per controllare risposte in cui gli errori di validazione vengono restituiti come struttura JSON o in cui gli errori di validazione sono stati salvati nella sessione:
$response->assertInvalid(['name', 'email']);
Puoi anche verificare che una determinata chiave abbia un messaggio di errore di validazione specifico. In questo caso, puoi fornire l’intero messaggio o solo una parte del messaggio:
$response->assertInvalid([
'name' => 'The name field is required.',
'email' => 'valid email address',
]);