今回は、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で日付(時刻)のフォーマットをテストする方法について解説しました。
少しでも参考になっていれば幸いです。
