HTTP-Test
HTTP Tests
Einführung
Laravel bietet eine sehr flüssige API sowohl für die Generierung von HTTP-Anfragen als auch für die Überprüfung der Ausgabe. Sie können sich beispielsweise den folgenden Testfall ansehen: Die Methode
<?php namespace Tests\Feature; use Tests\TestCase; use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Foundation\Testing\WithoutMiddleware; class ExampleTest extends TestCase{ /** * 一个基础的测试用例。 * * @return void */ public function testBasicTest() { $response = $this->get('/'); $response->assertStatus(200); } }
get
erstellt eine GET
-Anfrage an Ihre Anwendung und die Methode assertStatus
stellt sicher, dass die zurückgegebene Antwort den angegebenen HTTP-Status hat Code. Zusätzlich zu dieser einfachen Behauptung enthält Laravel auch verschiedene Behauptungen, die Antwortheader, Inhalt, JSON, Struktur usw. überprüfen.
Benutzerdefinierte Anforderungsheader
Sie können die withHeaders
-Methode verwenden, um die Anforderung anzupassen, bevor Sie sie an senden Anwendungsheader. Sie können beliebige benutzerdefinierte Header hinzufügen.
<?php class ExampleTest extends TestCase{ /** * 一个基础的功能测试用例。 * * @return void */ public function testBasicExample() { $response = $this->withHeaders([ 'X-Header' => 'Value', ])->json('POST', '/user', ['name' => 'Sally']); $response ->assertStatus(201) ->assertJson([ 'created' => true, ]); } }
{tip} Die CSRF-Middleware wird beim Ausführen von Tests automatisch deaktiviert.
Sitzung/Authentifizierung
Laravel bietet mehrere Helfer für die Verwendung von Session während der HTTP-Testfunktion. Zuerst müssen Sie ein Array an die Methode withSession
übergeben, um die Sitzungsdaten festzulegen. Dadurch können Sie die Sitzung ganz einfach mit Daten laden, bevor Sie die Testanfrage der Anwendung senden:
<?php class ExampleTest extends TestCase{ public function testApplication() { $response = $this->withSession(['foo' => 'bar']) ->get('/'); } }
Natürlich wird die Sitzung im Allgemeinen zur Aufrechterhaltung des Benutzerstatus verwendet, beispielsweise zur Authentifizierung von Benutzern. actingAs
Hilfsfunktionen bieten eine einfache Möglichkeit, den Benutzer anzugeben, der sich als aktueller Benutzer authentifizieren soll. Beispielsweise können wir das Factory-Modell verwenden, um Benutzer zu generieren und zu authentifizieren:
<?php use App\User; class ExampleTest extends TestCase{ public function testApplication() { $user = factory(User::class)->create(); $response = $this->actingAs($user) ->withSession(['foo' => 'bar']) ->get('/'); } }
Sie können auch angeben, über welchen Watcher der Benutzer authentifiziert wird, indem Sie den Watcher-Namen als zweiten Parameter von actingAs
übergeben:
$this->actingAs($user, 'api')
JSON testen APIs
Laravel bietet außerdem mehrere Hilfsfunktionen zum Testen von JSON-APIs und deren Antworten. Beispielsweise können json
, get
, post
, put
, patch
und delete
zum Senden verschiedener HTTP-Aktionen verwendet werden. Sie können diesen Methoden auch problemlos Daten und Anforderungsheader übergeben. Beginnen wir mit der Verwendung, indem wir eine POST
-Anfrage an /user
schreiben und bestätigen, dass die erwarteten Daten zurückgegeben werden:
<?php class ExampleTest extends TestCase{ /** * 一个简单的功能测试用例。 * * @return void */ public function testBasicExample() { $response = $this->json('POST', '/user', ['name' => 'Sally']); $response ->assertStatus(201) ->assertJson([ 'created' => true, ]); } }
{tip} Die
assertJson
-Methode wandelt die Antwort in ein Array um und verwendet dasPHPUnit::assertArraySubset
, um zu überprüfen, ob das angegebene Array in der von der Anwendung zurückgegebenen JSON-Antwort vorhanden ist. Wenn also andere Attribute in der JSON-Antwort vorhanden sind, wird der Test trotzdem bestanden, sofern das Array vorhanden ist:
Überprüfen Sie eine genaue Übereinstimmung
, wenn Sie ein bestimmtes Array exakt überprüfen möchten Um von einer Anwendung zurückgegebene JSON-Ergebnisse abzugleichen, sollten Sie die Methode assertExactJson
verwenden:
<?php class ExampleTest extends TestCase{ /** * 一个基本的功能测试用例。 * * @return void */ public function testBasicExample() { $response = $this->json('POST', '/user', ['name' => 'Sally']); $response ->assertStatus(201) ->assertExactJson([ 'created' => true, ]); } }
Testdatei-Upload
IlluminateHttpUploadedFile
bietet eine fake
Methode zum Generieren virtueller Dateien oder Bilder zu Testzwecken. Es kann mit der Storage
-Methode der fake
-Fassade kombiniert werden, um das Testen des Datei-Uploads erheblich zu vereinfachen. Beispielsweise können Sie die beiden Funktionen kombinieren, um das Avatar-Upload-Formular ganz bequem zu testen:
<?php namespace Tests\Feature; use Tests\TestCase; use Illuminate\Http\UploadedFile; use Illuminate\Support\Facades\Storage; use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Foundation\Testing\WithoutMiddleware; class ExampleTest extends TestCase{ public function testAvatarUpload() { Storage::fake('avatars'); $file = UploadedFile::fake()->image('avatar.jpg'); $response = $this->json('POST', '/avatar', [ 'avatar' => $file, ]); // 断言文件已经存储 . . . Storage::disk('avatars')->assertExists($file->hashName()); // 断言文件不存在 . . . Storage::disk('avatars')->assertMissing('missing.jpg'); } }
Virtuelle Dateivorbereitung
In Verwendung fake
Wenn Sie eine Datei mit dieser Methode erstellen, können Sie die Breite, Höhe und Größe des Bildes angeben, um die Testregeln besser zu überprüfen:
UploadedFile::fake()->image('avatar.jpg', $width, $height)->size(100);
Zusätzlich zum Erstellen von Bildern können Sie auch create
verwenden Methoden zum Erstellen anderer Dateitypen:
UploadedFile::fake()->create('document.pdf', $sizeInKilobytes);
Verfügbare Behauptungen
Response Assertion
Laravel bietet eine Vielzahl gängiger Assertionsmethoden für PHPUnit-Tests. Verfügbar unter json
, get
, post
, put
und delete
Greifen Sie in der Testmethode auf diese Behauptungen zu:
assertCookie
assertCookieExpired
assertCookieNotExpired
assertCookieMissing
assertDo ntSee
assertDontSeeText
assertExactJson
assert Verboten
assertHeader
assertHeaderMissing
ass ertJson
assertJsonCount
assertJsonFragment
ass ertJsonMissing
assertJsonMissingExact
assertJsonMissin gValidationErrors
assertJsonStructure
assertJsonValida tionErrors
assertLocation
assertNotFound
asser tOk
assertPlainCookie
assertRedirect
assertSee
assertSeeInOrder
assertSeeText
assertSeeTextI nOrder
assertSessionHas
assertSessionHasAll
as sertSessionHasErrors
assertSessionHasErrorsIn
assertSe ssionHasNoErrors
assertSessionDoesntHaveErrors
assertS sessionMissing
assertStatus
assertSuccessful
as sertViewHas
assertViewHasAll
assertViewIs
asser rtViewMissing
assertCookie
Bestätigt, dass die Antwort das Gegebene enthält Cookie:
$response->assertCookie($cookieName, $value = null);
assertCookieExpired
Stellen Sie sicher, dass die Antwort das angegebene Cookie enthält und es ist abgelaufen:
$response->assertCookieExpired($cookieName);
assertCookieNotExpired
Stellen Sie sicher, dass das angegebene Cookie in der Antwort enthalten war und es ist nicht abgelaufen:
$response->assertCookieNotExpired($cookieName);
assertCookieMissing
Bestätigt, dass die Antwort das Gegebene nicht enthält Cookie:
$response->assertCookieMissing($cookieName);
assertDontSee
Stellen Sie sicher, dass die angegebene Zeichenfolge nicht in der Antwort enthalten ist:
$response->assertDontSee($value);
as sertDontSeeText
Bestätigt, dass die angegebene Zeichenfolge nicht im Antworttext enthalten ist:
$response->assertDontSeeText($value);
assertExactJson
< 🎜 Stellen Sie sicher, dass die in der Antwort enthaltenen Daten mit den angegebenen übereinstimmen JSON Die Daten stimmen genau mit:$response->assertExactJson(array $data);assertForbiddenAssertionsantwort Es gibt einen verbotenen Statuscode:
$response->assertForbidden();assertHeader Bestätigt, was in der Antwort angegeben ist Header:
$response->assertHeader($headerName, $value = null);assertHeaderMissingAssertion-Antwort Es gibt keinen angegebenen Header in:
$response->assertHeaderMissing($headerName);assertJson Bestätigt, dass die Antwort das Gegebene enthält JSON-Daten:
$response->assertJson(array $data);assertJsonCountAssertionsantwort JSON Es gibt ein Array, das die erwartete Anzahl von Elementen für einen bestimmten Schlüssel enthält:
$response->assertJsonCount($count, $key = null);assertJsonFragment Bestätigen, dass die Antwort enthält gegebenes JSON Snippet:
$response->assertJsonFragment(array $data);assertJsonMissingStellen Sie sicher, dass die Antwort nicht den angegebenen JSON enthält Snippet:
$response->assertJsonMissing(array $data);assertJsonMissingExactStellen Sie sicher, dass die Antwort kein exaktes JSON enthält Snippet:
$response->assertJsonMissingExact(array $data);assertJsonMissingValidationErrorsStellen Sie sicher, dass die Antwort kein JSON für den angegebenen Schlüssel hat Validierungsfehler:
$response->assertJsonMissingValidationErrors($keys);assertJsonStructureStellen Sie sicher, dass die Antwort den angegebenen JSON hat Struktur:
$response->assertJsonStructure(array $structure);
assertJsonValidationErrors
Stellen Sie sicher, dass die Antwort Validierungsfehler für den angegebenen JSON mit dem angegebenen Schlüssel aufweist:
$response->assertJsonValidationErrors($keys);
assertLocation
Antwort bestätigen in Location
mit der angegebenen URI im Header Wert:
$response->assertLocation($uri);
assertNotFound
Assertion-Antwortobjekt Statuscode nicht gefunden:
$response->assertNotFound();
assertOk
Antwort bestätigen Ja 200 Statuscode:
$response->assertOk();
assertPlainCookie
Stellen Sie sicher, dass die Antwort das angegebene Cookie enthält (unverschlüsselt):
$response->assertPlainCookie($cookieName, $value = null);
assertRedirect
Stellen Sie sicher, dass die Antwort an die angegebene Adresse weitergeleitet wird URI:
$response->assertRedirect($uri);
assertSee
Bestätigen, dass die angegebene Zeichenfolge in der Antwort enthalten ist:
$response->assertSee($value);
assertSeeInOrder
Stellen Sie sicher, dass die Antwort die angegebene Zeichenfolge in der folgenden Reihenfolge enthält:
$response->assertSeeInOrder(array $values);
a ssertSeeText
Stellt sicher, dass die angegebene Zeichenfolge im Antworttext enthalten ist:
$response->assertSeeText($value);
assertSeeTextInOr der
Stellen Sie sicher, dass die angegebene Zeichenfolge im Antworttext in der folgenden Reihenfolge enthalten ist:
$response->assertSeeTextInOrder(array $values);
assertSessionHas
Behauptung Die Sitzung enthält die angegebenen Daten:
$response->assertSessionHas($key, $value = null);
assertSessionHasAll
Assert session Es gibt eine Liste der angegebenen Werte in:
$response->assertSessionHasAll(array $data);
assertSessionHasErrors
Assert session Enthält einen Fehler für ein bestimmtes Feld:
$response->assertSessionHasErrors(array $keys, $format = null, $errorBag = 'default');
assertSessionHasErrorsIn
assert session mit dem angegebenen Fehler:
$response->assertSessionHasErrorsIn($errorBag, $keys = [], $format = null);
assertSessionHasNoErrors
assert session Keine Fehler:
$response->assertSessionHasNoErrors();
assertSessionDoesntHaveErrors
Assert-Sitzung Kein Schlüsselfehler angegeben:
$response->assertSessionDoesntHaveErrors($keys = [], $format = null, $errorBag = 'default');
assertSessionMissing
Assert-Sitzung Der angegebene Schlüssel ist nicht enthalten in:
$response->assertSessionMissing($key);
assertStatus
Bestätigt, dass die Antwort den angegebenen Statuscode hat:
$response->assertStatus($code);
assertSuccessful
Stellen Sie sicher, dass die Antwort einen erfolgreichen Statuscode enthält:
$response->assertSuccessful();
assertViewHas
Assert Die Antwortansicht ist ein gegebenes Datenelement:
$response->assertViewHas($key, $value = null);
assertVi ewHasAll
Bestätigt, dass die Antwortansicht die angegebene Datenliste enthält:
$response->assertViewHasAll(array $data);
assertViewIs
Assert Route gibt die angegebene Ansicht zurück:
$response->assertViewIs($value);
assertViewMissing
Bestätigen Sie, dass die Antwortansicht fehlt Ein verbindliches Datenelement:
$response->assertViewMissing($key);
Authentifizierung Behauptungen
Laravel bietet auch verschiedene authentifizierungsbezogene Behauptungen für Ihre PHPUnit-Tests:
Method | Description |
---|---|
$this->assertAuthenticated($guard = null); | 断言此用户已被认证。 |
$this->assertGuest($guard = null); | 断言此用户未被认证。 |
$this->assertAuthenticatedAs($user, $guard = null); | 断言给定的用户被认证。 |
$this->assertCredentials(array $credentials, $guard = null); | 断言给定的凭证有效。 |
$this->assertInvalidCredentials(array $credentials, $guard = null); | 断言给定的凭证无效。 |