Help us understand the problem. What is going on with this article?

CircleCIについて

前提

本日学んだことを書いていきます。

本題

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にリダイレクトされたかどうかをテストする

ArticleControllerTest.php
$response->assertRedirect(route('login'));

route('login')は、ログイン画面のURLを返す

factory関数とcreateメソッド
factory関数を使用することで、テストに必要なモデルのインスタンスを、ファクトリというものを利用して生成できる
factory(User::class)->create()とすることで、ファクトリによって生成されたUserモデルがデータベースに保存される
また、createメソッドは保存したモデルのインスタンスを返すので、これが変数$userに代入される

actingAsメソッド

ArticleControllerTest.php
$response = $this->actingAs($user)
            ->get(route('articles.create'));

引数として渡したUserモデルにてログインした状態を作り出す
その上で、get(route('articles.create'))を行うことで、ログイン済みの状態で記事投稿画面へアクセスしたことになり、そのレスポンスは変数$responseに代入される

Arrange-Act-Assertについて

テストの書き方のパターンとして、AAA(Arrange-Act-Assert)というものがある
日本語で言うと、準備・実行・検証

ArticleControllerTest.php
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を返す

yusuke_mrmt
自分用メモです。
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした