前提
本日学んだことを書いていきます。
本題
CI(継続的インテグレーション)
変更されたソースコードがGitHubなどのリポジトリに提出(プッシュ)されるたびに自動でテストを行うことで、変更後のソースコードをリポジトリのメインライン(masterブランチなど)に統合(gitで言うところのマージ)可能な状態にする仕組み
CD(継続的デリバリー)
メインラインのソースコードが変更されるたびに、自動で本番環境などにデプロイする仕組み
RefreshDatabase
TestCaseクラスを継承したクラスでRefreshDatabaseトレイトを使用すると、データベースをリセットする
なお、トレイトは継承と似たPHPの機能で、汎用性の高いメソッドなどをトレイトとしてまとめておき、他の複数のクラスで共通して使う、という使い方をする
テストのメソッド名
Laravelでは、テストにPHPUnitというテストフレームワークを使用する
PHPUnitでは、テストのメソッド名の先頭にtestを付ける必要がある
ここではindexメソッドのテストであるとわかるよう、testIndexという名前にすることにした
public function testIndex()
※メソッド名をtest始まりにしたくない場合は、以下の例のようにメソッドのドキュメントに@testと記述する
/**
* @test
*/
public function initialBalanceShouldBe0()
{
$this->assertSame(0, $this->ba->getBalance());
}
assertRedirect
引数として渡したURLにリダイレクトされたかどうかをテストする
$response->assertRedirect(route('login'));
route('login')は、ログイン画面のURLを返す
factory関数とcreateメソッド
factory関数を使用することで、テストに必要なモデルのインスタンスを、ファクトリというものを利用して生成できる
factory(User::class)->create()とすることで、ファクトリによって生成されたUserモデルがデータベースに保存される
また、createメソッドは保存したモデルのインスタンスを返すので、これが変数$userに代入される
actingAsメソッド
$response = $this->actingAs($user)
->get(route('articles.create'));
引数として渡したUserモデルにてログインした状態を作り出す
その上で、get(route('articles.create'))を行うことで、ログイン済みの状態で記事投稿画面へアクセスしたことになり、そのレスポンスは変数$responseに代入される
Arrange-Act-Assertについて
テストの書き方のパターンとして、AAA(Arrange-Act-Assert)というものがある
日本語で言うと、準備・実行・検証
public function testAuthCreate()
{
// テストに必要なUserモデルを「準備」
$user = factory(User::class)->create();
// ログインして記事投稿画面にアクセスすることを「実行」
$response = $this->actingAs($user)
->get(route('articles.create'));
// レスポンスを「検証」
$response->assertStatus(200)
->assertViewIs('articles.create');
}
引数と戻り値の型宣言
public function isLikedBy(?User $user): bool
isLikedByメソッドの引数$userの手前には、?Userと記述されている
Userと記述されていることで、引数$userの型はUserクラスのインスタンスであることが宣言されている
さらにUserの手前に?があることで、引数としてnullが渡されることを許容している
PHP7.1から、このnullableな型宣言が使用できる
: boolとあるのは、このメソッドの戻り値が論理型(trueかfalse)であることを宣言している
三項演算子の利用
return $user
? (bool)$this->likes->where('id', $user->id)->count()
: false;
$userがnullでなければ、
(bool)$this->likes->where('id', $user->id)->count()
の結果をメソッドの呼び出し元に返す
$userがnullであれば、falseを返す