はじめに
Laravelでは、アプリケーションのテスト中に必要なダミーデータを生成することができ、主な方法として「モック」、「ファクトリー」、「フェイカー」があります。
これらの方法の違いを理解することで、Laravelのテストを円滑に行うことが出来ます。
自らのメモとして簡単に残します。
モックとは
モックとは、アプリケーション内で他のクラスやメソッドに依存する部分を仮想化する方法です。
なぜ仮想化するのかというとアプリケーションではデータベースなど外部と連携が必要な場合があり、その際に連携先の状態によってテストが失敗することがあります。
なので、あらかじめ外部の振る舞いを想定したコードを書いておくことで失敗を避けることが出来ます。
モックをすることで外部の依存関係がない状態でテストを行うことが出来ます。
以下は、コントローラーからサービスを呼び出す場合にモックを使用してサービスを仮想的に置き換えています。
<?php
namespace Tests\Feature;
use App\Services\ExampleService;
use TestCase;
class ControllerTest extends TestCase
{
public function tearDown() {
\Mockery::close();
}
public function testGetIndex()
{
// 想定されるデータ
$expected = [
'title' = "テスト"
];
// モックを使用して置き換える
$serviceMock = \Mockery::mock(ExampleService::class);
$serviceMock->shouldReceive('getIndex')
->once()
->andReturn($expected);
});
// テストを実行、アサート
$response = $this->get('/')
->assertSuccessful()
->assertJson($expected);
}
}
ファクトリーとは
ファクトリーとは、モデルを使用してダミーデータを生成する方法です。
これにより、テスト中に必要なデータを簡単に生成することができます。
Laravelにはfactoryメソッドが用意されており、これを使用してファクトリーを定義することができます。
以下は、Userモデル用のファクトリーを使用した例です。
<?php
namespace Tests\Feature;
use App\Models\User;
use TestCase;
class ControllerTest extends TestCase
{
public function testGetIndex()
{
// Factoryでuserを作成
$TestUser = User::factory()->create([
'name' => "テスト太郎",
'email' => "example@gmail.com",
]);
// テストを実行、アサート
$this->assertDatabaseHas('users', [
'name' => "テスト太郎",
'email' => "example@gmail.com",
]);
}
}
上記の例では、name
とemail
の値を指定しuserを生成しています。
フェイカーとは
フェイカーは、データをランダムに生成するための方法です。
これにより、ファクトリーと同様にダミーデータを簡単に生成できます。
例えば、名前、住所、電話番号、メールアドレス、文章など、様々な種類のデータをランダムに生成することができ、生成したデータは、ファクトリーやシーダーで使用することができます。
以下は、Userモデル用のファクトリーにフェイカーを追加した使用した例です。
<?php
namespace Tests\Feature;
use App\Models\User;
use Illuminate\Foundation\Testing\WithFaker;
use TestCase;
class ControllerTest extends TestCase
{
use WithFaker;
public function testGetIndex()
{
// Fakerでuserを作成
$TestUser = User::factory()->create([
'name' => $this->faker->name(),
'email' => $this->faker->email(),
]);
// テストを実行、アサート
$this->assertDatabaseHas('users', [
'name' => $TestUser->name,
'email' => $TestUser->email,
]);
}
}
終わりに
それぞれについて簡単に記載しましたが、あくまで一例なのでより詳しく調べたい場合はLaravelの公式を見ていただければと思います。
公式には詳細な説明と使用例が載っているので困ったらとりあえず公式見るのが最強です。