今回は、Laravelでテストを書く際に日付・時刻のフォーマットをテストする方法をまとめます。
少しでも「日付(時刻)のフォーマットってどうテストするんだ。。」と思っている方の参考になれば幸いです。
PHPUnitで日付・時刻のフォーマットをテストする方法
結論から言うとstrptimeメソッドを使います。
テストの実例は後ほど紹介するとして、まずはstrptimeメソッドについて説明しましょう。
strptimeメソッドについて
strptimeメソッドは、以下のフォーマットで使用します。
strptime ( string $date , string $format ) : array
第一引数には特定のフォーマットの日付を、第二引数には第一引数の日付のフォーマットを指定します。
この関数が行うことは、日付のパース(解析)です。日付を解析、変換して配列形式で返却します。
例えば、次のようなフォーマットを第一引数に指定した場合、
2020-09-19 02:59:01
以下のようにstrptime関数を通せば
strptime("2020-09-19 02:59:01", '%Y-%m-%d %H:%M:%S')
次のような結果が返ってきます。
array(9) { ["tm_sec"]=> int(1) ["tm_min"]=> int(59) ["tm_hour"]=> int(2) ["tm_mday"]=> int(19) ["tm_mon"]=> int(8) ["tm_year"]=> int(120) ["tm_wday"]=> int(6) ["tm_yday"]=> int(262) ["unparsed"]=> string(0) "" }
便利な関数ではあるのですが、日付のフォーマットをテストする上で、上記のreturn値は重要ではありません。
重要なのは、strptime関数の第一引数と第二引数のフォーマットを合わせれば上記のような配列が得られるが、フォーマットが異なる場合はfalseが返ってくる点です。
日付フォーマットのテストではこの特性を利用します。
falseが返っていないことをアサートすれば、それが「正しいフォーマットを利用している」ことの証明(テスト)となるからです。
さて、ここまで長々と書いてきましたが、実際に日付のフォーマットをテストする上では、以下のポイントだけ押さえておけば十分だと思います。
strptime関数:第一引数に指定した日付と同じフォーマットを第二引数に指定しなければfalseを返す関数。逆に言えば、第一引数と第二引数のフォーマットが同じならfalse以外(配列)が返る
strptime関数については理解できたと思うので、次に、実際にstrptime関数を使って日付のフォーマットをテストしてみたいと思います。
strptimeを用いたテスト例
まずはテストの準備として、日付(時間)を返すクラスを作成します。
<?php namespace App\Services; class DateService { public function getDate() { return date('Y-m-d H:i:s', time()); } }
単にdate関数で現在時刻をフォーマットしてreturnしているだけです。ここでは、以下のようなフォーマットの時刻が返されます。
2020-09-19 12:38:49
次にこの関数で生成する時刻のフォーマットが正しいか(意図したフォーマットとなっているか)を判定するテストを作成します。
<?php namespace Tests\Services; use Tests\TestCase; use App\Services\DateService; class DateServiceTest extends TestCase { /** @test */ public function 日付のフォーマットが正しいかテスト() { $service = new DateService; $result = $service->getDate(); $this->assertNotFalse(strptime($result, '%Y-%m-%d %H:%M:%S')); } }
先ほど説明した通り、strptimeメソッドでは、第一引数と第二引数のフォーマットが同じ場合は配列を返し、異なる場合はfalseを返します。
つまり、「フォーマットが正しい場合はfalse以外が返る」ということです。
そのため、アサーションとしてはassertNotFalseを指定します。このアサーションにより、「false以外が返っていること」を担保できるからです。
また、strptimeメソッドの第二引数に指定するフォーマットはこちらを参考にしています。
それでは実際にテストを動かしてみましょう。
通っていますね。
以上で、「false以外が返ってきている=正しい(意図した)フォーマットの日付が返ってきている」ことがテストできました。
おわりに
今回は、strptime関数を使ってphpunitで日付(時刻)のフォーマットをテストする方法について解説しました。
少しでも参考になっていれば幸いです。