データベースのテスト
- 各テスト後にデータベースをリセット
- モデル ファクトリの作成
- #ファクトリ ステータス
- ファクトリ コールバック
- #モデル ファクトリを使用する
- モデルを作成する
- 永続モデル
- 関連付け
- 利用可能なアサーション メソッド
データベース テスト
はじめに
Laravel は、データベース駆動型アプリケーションのテストを容易にするさまざまな便利なツールを提供します。まず、
assertDatabaseHas
ヘルパーを使用して、データベース内に存在するデータが特定の条件セットに一致することをアサートできます。たとえば、users
テーブルのレコードにsally @ example.com
のemail
値があることを確認する場合は、次の手順を実行します。public function testDatabase(){ // Make call to application... $this->assertDatabaseHas('users', [ 'email' => 'sally@example.com' ]); }
assertDatabaseMissing
ヘルパーを使用して、データベースにデータが存在しないことをアサートすることもできます。assertDatabaseHas
メソッドと他の同様のヘルパーが便宜上提供されています。テストを補足するために、PHPUnit の組み込みアサーション メソッドを自由に使用できます。モデル ファクトリの生成
make:factory
アーティザン コマンドを使用してモデル ファクトリを作成します:php artisan make:factory PostFactory
新しく生成されたファクトリの場所は、
database/factories
ディレクトリ内にあります。--model
オプションは、ファクトリによって作成されたモデルの名前を示すために使用できます。このオプションは、生成されたファクトリ ファイルに指定されたモデルを事前に設定します:php artisan make:factory PostFactory --model=Post
各テスト後にデータベースをリセットします
各テスト後にデータベースをリセットします。多くの場合、以前のテストのデータが後続のテストに干渉しないように、後でデータベースをリセットするのに役立ちます。
RefreshDatabase
機能は、インメモリ データベースと従来のデータベースのどちらを使用しているかに応じて、テスト データベースの移行に最も最適化されたアプローチを採用します。テスト クラスで特性を使用すると、すべてが自動的に処理されます。<?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('/'); // ... } }
モデル ファクトリの作成
テスト時には、必要な場合があります。テストする前にデータベースにいくつかのレコードを挿入します。このテスト データを作成するとき、各列の値を手動で指定する代わりに、Laravel ではモデル ファクトリを使用して各 Eloquent モデルのデフォルト プロパティのセットを定義できます。テストを開始する前に、アプリケーション内の
database/factories/UserFactory.php
ファイルを確認してください。すぐに使えるこのファイルには、ファクトリ定義が含まれています: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), ]; });
ファクトリ定義として使用されるクロージャでは、モデル上のすべてのプロパティのデフォルトのテスト値を返すことができます。 Closure は、Faker PHP ライブラリのインスタンスを受け取ります。これにより、テスト用にさまざまなランダム データを簡単に生成できます。
さらに、整理しやすくするために、モデルごとに追加のファクトリー ファイルを作成することもできます。たとえば、
UserFactory.php
ファイルとCommentFactory.php
ファイルをdatabase/factories
ディレクトリに作成できます。factories
ディレクトリ内のすべてのファイルは、Laravel によって自動的にロードされます。Faker のロケールを設定するには、
config/app.php
設定ファイルにfaker_locale
オプションを追加します。ファクトリ ステート
ステートを使用すると、任意の組み合わせでモデル ファクトリに適用できる個別の変更を定義できます。たとえば、
User
モデルには、デフォルトのプロパティ値の 1 つが変更できるdeinquent
状態がある可能性があります。state
メソッドを使用して状態遷移を定義できます。単純な状態の場合、一連のプロパティ変更を渡すことができます:$factory->state(App\User::class, 'delinquent', [ 'account_status' => 'delinquent', ]);
状態に計算または
$ faker
インスタンスが必要な場合は、Closure を使用して状態のプロパティ変更を計算できます:$factory->state(App\User::class, 'address', function ($faker) { return [ 'address' => $faker->address, ]; });
ファクトリ コールバック
afterMaking
メソッドとafterCreating
メソッドを使用してファクトリ コールバックを登録し、または、モデルの作成後に他のタスクを実行します。たとえば、コールバックを使用して、他のモデルを作成されたモデルに関連付けることができます:$factory->afterMaking(App\User::class, function ($user, $faker) { // ... }); $factory->afterCreating(App\User::class, function ($user, $faker) { $user->accounts()->save(factory(App\Account::class)->make()); });
また、ファクトリ状態のコールバックを定義することもできます:
$factory->afterMakingState(App\User::class, 'delinquent', function ($user, $faker) { // ... }); $factory->afterCreatingState(App\User::class, 'delinquent', function ($user, $faker) { // ... });
# #モデル ファクトリを使用するモデルを作成するモデル ファクトリを定義した後、テストでグローバルfactory# を使用できます。またはシード ファイル ## モデル インスタンスを生成する関数。それでは、モデルの作成例をいくつか見てみましょう。まず、
make
メソッドを使用して、モデルをデータベースに保存せずに作成します。
多くのモデルのコレクションを作成したり、特定のタイプのモデルを作成したりすることもできます。public function testDatabase(){ $user = factory(App\User::class)->make(); //在测试中使用模型... }
//创建三个 App\User 实例... $users = factory(App\User::class, 3)->make();
状態の適用
任意の状態をモデルに適用することもできます。複数の状態遷移をモデルに適用する場合は、適用する各状態の名前を指定する必要があります。
$users = factory(App\User::class, 5)->states('delinquent')->make(); $users = factory(App\User::class, 5)->states('premium', 'delinquent')->make();
Override Properties
モデルのデフォルト値の一部をオーバーライドする場合
makeメソッドに渡される値の配列。指定された値のみが置換され、残りの値は工場出荷時に指定されたデフォルト値に設定されたままになります:
create$user = factory(App\User::class)->make([ 'name' => 'Abigail', ]);
メソッドはモデル インスタンスを作成するだけでなく、Eloquent の
作成する配列save
メソッドを使用してデータベースに保存します。
これを行うには、次のように渡します。public function testDatabase(){ // 创建单个 App\User 实例... $user = factory(App\User::class)->create(); // 创建3个 App\User 实例.. $users = factory(App\User::class, 3)->create(); // 在测试中使用模型... }
モデルのプロパティをオーバーライドするメソッド:
$user = factory(App\User::class)->create([ 'name' => 'Abigail', ]);
メソッド 説明 ##$this->assertDatabaseHas( $table, array $data); データベース テーブルに指定されたデータが含まれていることをアサートします。
$this->assertDatabaseMissing($table, array $data); データベース テーブルに指定されたデータが含まれていないことをアサートします。
$this->assertSoftDeleted($table, array $data); この記事は、データベース内の指定されたレコードがソフトであることをアサートします削除されました。
- #関連付けとプロパティのクロージャ