Datenbanktests
- Einführung
- Modellfabrik generieren
- Nach jedem Test neu starten Datenbank festlegen
- Modellfabrik erstellen
- Werksstatus
- Werksrückruf
Datenbank Testen
- Einführung
- Modellfabrik generieren
- Datenbank nach jedem Test zurücksetzen
- Schreibfabrik
- Modellfabrik im Test verwenden
- Verfügbare Behauptungsmethoden
Einführung
Laravel Bietet eine Vielzahl nützlicher Tools, um das Testen datenbankgesteuerter Anwendungen zu vereinfachen. Erstens können Sie den
assertDatabaseHas
-Helfer verwenden, um sicherzustellen, dass die in der Datenbank vorhandenen Daten einem bestimmten Satz von Bedingungen entsprechen. Wenn Sie beispielsweise überprüfen möchten, ob ein Datensatz in derusers
-Tabelle einensally @ example.com
-Wert vonemail
hat, können Sie Folgendes tun:public function testDatabase(){ // Make call to application... $this->assertDatabaseHas('users', [ 'email' => 'sally@example.com' ]); }
Sie können auch den
assertDatabaseMissing
-Helfer verwenden um zu behaupten, dass keine Daten vorhanden sind. Der Einfachheit halber werden dieassertDatabaseHas
-Methode und andere ähnliche Hilfsmittel bereitgestellt. Es steht Ihnen frei, jede der integrierten Assertionsmethoden von PHPUnit zur Ergänzung Ihrer Tests zu verwenden.Modellfabrik generieren
Verwenden Sie den
make:factory
Artisan-Befehl, um eine Modellfabrik zu erstellen:php artisan make:factory PostFactory
Neu generierte The Der Fabrikstandort befindet sich im Verzeichnis
database/factories
. Mit der Option--model
kann der Name des werkseitig erstellten Modells angegeben werden. Diese Option füllt die generierte Factory-Datei vorab mit dem angegebenen Modell:php artisan make:factory PostFactory --model=Post
Datenbank nach jedem Test zurücksetzen
Nach jedem Test Oftmals ist es sinnvoll, die Datenbank anschließend zurückzusetzen, damit die Daten eines früheren Tests nicht mit nachfolgenden Tests in Konflikt geraten.
RefreshDatabase
Die Funktionen verfolgen den am besten optimierten Ansatz für die Migration von Testdatenbanken, je nachdem, ob Sie eine In-Memory-Datenbank oder eine herkömmliche Datenbank verwenden. Verwenden Sie Merkmale in Ihrer Testklasse und alles wird für Sie erledigt:<?php namespace Tests\Feature; use Tests\TestCase; use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Foundation\Testing\WithoutMiddleware; class ExampleTest extends TestCase{ use RefreshDatabase; /** * 一个基本功能测试示例 * * @return void */ public function testBasicExample() { $response = $this->get('/'); // ... } }
Modellfabrik erstellen
Beim Testen benötigen Sie möglicherweise Fügen Sie vor dem Testen einige Datensätze in die Datenbank ein. Anstatt die Werte für jede Spalte manuell anzugeben, können Sie bei der Erstellung dieser Testdaten mit Laravel eine Modellfabrik verwenden, um einen Satz Standardeigenschaften für jedes Eloquent-Modell zu definieren. Bevor Sie mit dem Test beginnen, überprüfen Sie bitte die Datei
database / factories / UserFactory.php
im Antrag. Standardmäßig enthält diese Datei eine Factory-Definition:use Illuminate\Support\Str; use Faker\Generator as Faker; $factory->define(App\User::class, function (Faker $faker) { return [ 'name' => $faker->name, 'email' => $faker->unique()->safeEmail, 'email_verified_at' => now(), 'password' => 'y$TKh8H1.PfQx37YgCzwiKb.KjNyWgaHb9cbcoQgdIVFlYg7B77UdFm', // secret 'remember_token' => Str::random(10), ]; });
In einem Abschluss, der als Fabrikdefinition verwendet wird, können Sie Standardtestwerte für alle Eigenschaften im Modell zurückgeben. Closure erhält eine Instanz der PHP-Bibliothek Faker, mit der Sie bequem eine Vielzahl zufälliger Daten zum Testen generieren können.
Zur besseren Organisation können Sie auch zusätzliche Werksdateien für jedes Modell erstellen. Sie können beispielsweise
database / factories
- undUserFactory.php
-Dateien im VerzeichnisCommentFactory.php
erstellen. Alle Dateien im Verzeichnisfactories
werden von Laravel automatisch geladen.Sie können das Gebietsschema von Faker festlegen, indem Sie die Option
config / app.php
in der Konfigurationsdateifaker_locale
hinzufügen.Fabrikzustände
Zustände ermöglichen es Ihnen, diskrete Änderungen zu definieren, die in beliebiger Kombination auf Modellfabriken angewendet werden können. Beispielsweise könnte Ihr
User
-Modell einendeinquent
-Zustand haben, der einen seiner Standardeigenschaftswerte ändert. Sie können Zustandsübergänge mit der Methodestate
definieren. Für einfache Staaten können Sie eine Reihe von Eigenschaftsänderungen übergeben:$factory->state(App\User::class, 'delinquent', [ 'account_status' => 'delinquent', ]);
Wenn Ihr Staat Berechnungen oder
$ faker
Instanzen erfordert, können Sie „Closure“ verwenden, um die Eigenschaftsänderungen des Staates zu berechnen:$factory->state(App\User::class, 'address', function ($faker) { return [ 'address' => $faker->address, ]; });
Werksrückruf
Verwenden Sie
afterMaking
und DieafterCreating
-Methode registriert einen Factory-Callback und ermöglicht Ihnen die Ausführung anderer Aufgaben am oder nach der Erstellung des Modells. Sie können beispielsweise Rückrufe verwenden, um andere Modelle mit dem erstellten Modell zu verknüpfen:$factory->afterMaking(App\User::class, function ($user, $faker) { // ... }); $factory->afterCreating(App\User::class, function ($user, $faker) { $user->accounts()->save(factory(App\Account::class)->make()); });
Sie können auch einen Werkszustand für angeben Rückruf definieren:
$factory->afterMakingState(App\User::class, 'delinquent', function ($user, $faker) { // ... }); $factory->afterCreatingState(App\User::class, 'delinquent', function ($user, $faker) { // ... });
Modellfabrik verwenden
Modell erstellen
Sobald die Modellfabrik definiert ist, kann sie global in Tests oder Torrent-Dateien verwendet werden
factory
Funktion zum Generieren von Modellinstanzen. Schauen wir uns also einige Beispiele für die Erstellung von Modellen an. Zuerst verwenden wir die Methodemake
, um Modelle zu erstellen, ohne sie in der Datenbank zu speichern:public function testDatabase(){ $user = factory(App\User::class)->make(); //在测试中使用模型... }
Sie können auch eine Sammlung vieler Modelle oder ein Modell eines bestimmten Typs erstellen:
//创建三个 App\User 实例... $users = factory(App\User::class, 3)->make();
Zustände anwenden
Sie können auch beliebige Zustände auf ein Modell anwenden. Wenn Sie mehrere Zustandsübergänge auf ein Modell anwenden möchten, sollten Sie den Namen jedes anzuwendenden Zustands angeben:
$users = factory(App\User::class, 5)->states('delinquent')->make(); $users = factory(App\User::class, 5)->states('premium', 'delinquent')->make();
Eigenschaften überschreiben
Wenn Sie einige der Standardwerte des Modells überschreiben möchten , Sie können ein Array von Werten an die Methode
make
übergeben. Es werden nur die angegebenen Werte ersetzt, während die restlichen Werte weiterhin auf die werkseitig festgelegten Standardwerte gesetzt werden:$user = factory(App\User::class)->make([ 'name' => 'Abigail', ]);
Persistence Model
< Die 🎜>-Methode erstellt nicht nur eine Modellinstanz, sondern verwendet auch Eloquents
create
Methode, um sie in der Datenbank zu speichern:save
public function testDatabase(){ // 创建单个 App\User 实例... $user = factory(App\User::class)->create(); // 创建3个 App\User 实例.. $users = factory(App\User::class, 3)->create(); // 在测试中使用模型... }
Sie können Eigenschaften eines Modells überschreiben, indem Sie ein Array an die-Methode übergeben:
create
$user = factory(App\User::class)->create([ 'name' => 'Abigail', ]);
Beziehungen
In diesem Beispiel werden wir einige Beziehungen anhängen, die das Modell erstellen. Wenn Sie die
create
-Methode zum Erstellen mehrerer Modelle verwenden, wird eine Eloquent-Sammlungsinstanz zurückgegeben, sodass praktische Methoden wie jede für die Sammlung verwendet werden können:$users = factory(App\User::class, 3) ->create() ->each(function ($user) { $user->posts()->save(factory(App\Post::class)->make()); });
Assoziation und Eigenschaftsabschluss
Mithilfe der Eigenschaft „Closure“ in der Factory-Definition können Sie auch Beziehungen an Modelle anhängen. Wenn Sie beispielsweise beim Erstellen ein neues
Post
erstellen möchten Beispielsweise können Sie Folgendes tun:User
$factory->define(App\Post::class, function ($faker) { return [ 'title' => $faker->title, 'content' => $faker->paragraph, 'user_id' => function () { return factory(App\User::class)->create()->id; } ]; });
Diese Abschlüsse erhalten ein Array mit Fabrikeigenschaften:$factory->define(App\Post::class, function ($faker) { return [ 'title' => $faker->title, 'content' => $faker->paragraph, 'user_id' => function () { return factory(App\User::class)->create()->id; }, 'user_type' => function (array $post) { return App\User::find($post['user_id'])->type; } ]; });
Verfügbare AssertionsmethodenLaravel fürPHPUnit Der Test bietet mehrere Datenbank-Assertionsmethoden:
Dieser Artikel wurde zuerst auf der Website方法 描述 $this->assertDatabaseHas($table, array $data);
断言数据库表中包含给定的数据。 $this->assertDatabaseMissing($table, array $data);
断言数据库表中不包含给定的数据。 $this->assertSoftDeleted($table, array $data);
断言数据库中的指定记录已软删除。 LearnKu.com veröffentlicht.