Introductie
Laravel biedt een rijke API om HTTP-requests te simuleren en responses te verifiëren. Je kunt requests aan je applicatie binnen tests nabootsen zonder een echte HTTP-server op te zetten.get() stuurt een GET-request naar de applicatie en assertStatus() verifieert de HTTP-statuscode van de teruggekregen response.
Tijdens het uitvoeren van tests wordt de CSRF-middleware automatisch uitgeschakeld. Je hoeft die in tests niet expliciet uit te schakelen.
Requests maken
Binnen tests kun je requests versturen met de methodenget, post, put, patch en delete.
Deze methoden versturen geen echt netwerkrequest, maar simuleren het binnen de applicatie.
De retourwaarde is een instantie van Illuminate\Testing\TestResponse, die diverse assertion-methoden biedt.
Requestheaders aanpassen
Met de methodewithHeaders() pas je de headers van het request aan.
Cookies
Met de methodenwithCookie() of withCookies() stel je cookiewaarden in vóór het request.
Sessie en authenticatie
Met de methodewithSession() stel je sessiedata in vóór het request.
actingAs() verstuur je requests als geauthenticeerde gebruiker. Je gebruikt dit in combinatie met modelfactory’s.
actingAs(), dan wordt met die guard geauthenticeerd. Voor de duur van de test wordt die guard de standaard.
actingAsGuest().
Responses debuggen
Wil je tijdens een test de inhoud van de response bekijken, gebruik dan de methodendump, dumpHeaders en dumpSession.
dd, ddHeaders, ddBody, ddJson en ddSession.
Excepties testen
Om te testen dat een specifieke exceptie wordt gegooid, gebruik je deExceptions-facade.
assertNotReported of assertNothingReported.
withoutExceptionHandling().
assertThrows().
assertDoesntThrow().
JSON-API’s testen
Laravel biedt veel helpers voor het testen van JSON-API’s. Met de methodenjson, getJson, postJson, putJson, patchJson, deleteJson en optionsJson verstuur je JSON-requests.
assertJson() zet de response om naar een array en verifieert of de opgegeven array in de JSON-response voorkomt. Ook als de JSON andere properties bevat, slaagt de test zolang het opgegeven fragment aanwezig is.Assertions op exacte overeenkomst
MetassertExactJson() verifieer je dat de teruggegeven JSON exact overeenkomt met de opgegeven array.
Assertions op JSON-paden
MetassertJsonPath() verifieer je de data op een opgegeven pad.
Fluente JSON-tests
Geef je een closure door aanassertJson(), dan kun je met een AssertableJson-instantie fluent assertions schrijven.
has() en missing().
hasAll() en missingAll().
Assertions op JSON-collecties
Geeft een route een JSON-response met meerdere items terug, dan kun je met de methodehas() het aantal items en de inhoud van de collectie verifiëren.
each().
Assertions op JSON-types
MetwhereType() en whereAllType() verifieer je het type van properties.
|-teken kun je ook meerdere types opgeven. De assertion slaagt zodra één van de types overeenkomt.
string, integer, double, boolean, array en null.
Authenticatietests
MetactingAs() verstuur je requests als geauthenticeerde gebruiker.
Voorbeeld: de registratieflow testen
Een voorbeeld waarin het echte registratie-endpoint wordt getest.Sessies testen
MetwithSession() stel je vooraf sessiedata in en verstuur je vervolgens het request.
Met assertSessionHas() verifieer je of een waarde in de sessie bestaat.
Overzicht van sessie-assertions
Bestandsuploads testen
Met de methodefake() van de klasse Illuminate\Http\UploadedFile genereer je dummybestanden of -afbeeldingen.
In combinatie met de methode fake() van de Storage-facade test je bestandsuploads eenvoudig.
assertMissing().
Dummybestanden aanpassen
Je kunt de afmetingen en bestandsgrootte van afbeeldingen opgeven. Handig voor het testen van validatieregels.Views testen
Je kunt views direct renderen en testen zonder een HTTP-request te simuleren. De methodeview() accepteert een viewnaam en optioneel een array met data, en geeft een instantie van Illuminate\Testing\TestView terug.
TestView-klasse zijn de volgende assertion-methoden beschikbaar.
Om de inhoud van de gerenderde view als string op te halen, cast je de
TestView-instantie naar een string.
withViewErrors().
Componenten testen
Met de methodeblade() render je een ruwe Blade-templatestring.
component() render je een Blade-component. Deze geeft een instantie van Illuminate\Testing\TestComponent terug.
Overzicht van response-assertions
De belangrijkste assertion-methoden van de klasseIlluminate\Testing\TestResponse.
HTTP-status
Redirects
Content
JSON
Headers en cookies
Views
Validatie
Tips om TDD in de praktijk te brengen
Begin met feature-tests
Begin met feature-tests
HTTP-tests maak je aan in de directory
tests/Feature/. Door eerst het gedrag van buitenaf te definiëren (request → response) wordt duidelijk welke functionaliteit je moet implementeren.Gebruik RefreshDatabase
Gebruik RefreshDatabase
Gebruik in tests die de database gebruiken de trait
RefreshDatabase. Na elke test wordt de database gereset, waardoor data-interferentie tussen tests wordt voorkomen. Door tests onafhankelijk te houden bouw je een stabiele testsuite die niet afhangt van de uitvoeringsvolgorde.Gebruik factory's actief
Gebruik factory's actief
Met modelfactory’s zoals
User::factory()->create() maak je testdata eenvoudig aan. Door factory-states te definiëren voor modellen met een specifieke toestand verbeter je de leesbaarheid van je tests.Eén test, één assertion
Eén test, één assertion
Verifieer in één testmethode zo veel mogelijk maar één ding. Zo is de oorzaak makkelijker te achterhalen wanneer een test faalt. Met het AAA-patroon “Arrange (voorbereiden) → Act (uitvoeren) → Assert (verifiëren)” in gedachten worden je tests leesbaarder.
Vergeet authenticatietests niet
Vergeet authenticatietests niet
Schrijf voor routes die authenticatie vereisen altijd tests voor zowel het “geauthenticeerde” als het “niet-geauthenticeerde” geval. Zo ontdek je beveiligingsproblemen vroegtijdig.
Gerelateerde pagina’s
Introductie tot testen
Bekijk de basis van het schrijven van tests in Laravel en het gebruik van
php artisan test.