新しい連載を始めます。

Laravelは、出来合いのヘルパーやバリデーションがあり便利です。もの凄くたくさんあり覚えらないというほどの数ではないですが、すべてを頭の中で保持しておくのも大変です。また、こういう使い方では結果はどうなるのとか、実際に実行してみないとわからないことあります。

例えば、バリデーションのalphaは、文字列がすべて英字からなる(本当?)かをチェックします。このバリデーションを、ログイン名のチェックとかに使うとします。しかし、大文字でもOKなのとか、空白文字が入ってもOKなのとか、日本語の入力はどうなのとか、調べないとわからないことあります。Laravelのドキュメントではそこまで細かくは説明していません。

前回で説明したようにtinkerで簡単にチェックすることも可能ですが、面倒だなと思うときに、実例を素早く見ることができれば便利だと思いません?

そこで今回から、そんな便利な実例特集を連載する予定です。まず、その1つを見てください。以下は、Laravelのバリデーションのacceptedのユニットテストです。

実例の使い方

先に掲載したコードは、github.comgistを使用しています。gistは、一般的にスニペットと言われる、コピペ専用が目的のgitのレポジトリです。gitでコード管理するのと同様、cloneやforkの利用も可能です。

上のコードを実際にテストしてみたいなら、ララベル5.5のプロジェクトを作成して、そのプロジェクトのルートのディレクトリで、以下を実行してください。

$ git clone git@gist.github.com:cf781699c05c73d07fdbff8489052ef8.git tests/Unit/Validations/Accepted

コマンドラインで指定したURLは、

gistの画面において、embedのドロップダウンのリストから、Clone via SSHを指定して、表示されたURLを使います。以下の画面では、赤いボックスのところをクリックしてコピーできます。

コマンドの実行は、以下のように、tests/Unit/Validations/Acceptedのディレクトリを作成して、テストのファイルを作成してくれます。

tests/Unit
├── ExampleTest.php
└── Validations
    └── Accepted
        ├── 0.md
        └── AcceptedTest.php

ダウンロードしたところで、テストを実行してみましょう。

$ vendor/bin/phpunit --filter AcceptedTest
PHPUnit 6.5.8 by Sebastian Bergmann and contributors.

.........                                                           9 / 9 (100%)

Time: 201 ms, Memory: 12.00MB

OK (9 tests, 9 assertions)

と9つテストがすべて成功の結果を表示してくれます。

phpunitのデータプロバイダー

先のテストの実行では、9つのテストが成功、とありましたが、9つのテストなるゆえは、上のコードのprovider_acceptedの関数内に9つのデータ配列があるからです。

このユニットテストでは、phpunitのデータプロバイダー機能を使用しています。その機能では、コメントに入れる情報で、どこからデータを受け取るかを指定します。

    /**
     * @test ← 関数がテストの関数であることを指定
     * @dataProvider provider_accepted ← この関数からデータを取ってくることを指定
     */
    public function accepted($input, $expected)
    {
     ..

provider_accepted()では、

例えば、最初のデータ

[[‘field’ => null], false]

は、

[‘field’ => null] が accepted()の最初のパラメの$input

となり、

falseが、$expected

となります。

テストの実行では、9つのデータ配列があるので、データを変えて9回のテストの実行となります。そして、さらにいろいろテストしたいなら、そのデータと期待する結果をそこに追加すればよいだけです。

バリデーションの実例の連載開始

ということで、次回からバリデーションの実例を投稿していきます。まずは、Laravelにある規定のバリデーションですが、それだけでなくユーザー定義のバリデーションもアップしていく予定です。

By khino