12/31

PHP

PHPUnitのテストでDBのcreated_atを比較する

DBから作成/更新日時が最新/最古のレコードを取得する関数をテストしたい
seederで例えば以下のようにダミーレコードを作成している。

User::factory()->create([
  'created_at' => '2020-04-01'
])

で、例えば以下のようにテストするとエラーになる

$result = SomeRepository::GetOldestUser()
$this->assertSame('2020-04-01', $result['created_at])

なぜかというと、$result['created_at'] が '2020-04-01T00:00:00.000000Z'といった表記に変更されているから

というわけで、実質同じ時間かを判定するような関数がPHPUnitに入っていないかと思ったのですが、見た感じなかったようなので今回は以下のような形で解決しました。

$timeDiff = Carbon::parse('2020-04-02 10:00:00')
  ->diffInMicroseconds(Carbon::parse($result['created_at']));
self::assertEquals(0, $timeDiff);

ちなみに他の解決策として以下のようなものがありました。もっとスマートな解決方法はないでしょうか

 // 時刻が重要なことが伝わりづらい
assertEquals(1, $result['id'])
// DBやLaravelのバージョンで表記が揺れそう
assertEquals('2020-04-01T00:00:00.000000Z', $result['created_at']) 

ちなみにバージョンは
- PHP 7.4.11
- Laravel 8.11.2
- mysql 5.7 
でした。

というわけで宿題は、

- DBなどをつなぎ変えた時の挙動を調べる

https://phpunit.readthedocs.io/ja/latest/assertions.html (PHPUnitのアサーション一覧)をもっと読む

です。



この記事が気に入ったらサポートをしてみませんか?