底辺SE奮闘記

年収300万SEブログ

【phpunit】dataProvider内のタイムゾーンがUTCな件

えらい目にあったので共有。

現象

タイムゾーンをAsia/Tokyoに設定しているのに、UTCで内部処理されている(今回の場合はCarbon)

環境

  • Larvel ^8.75 時刻設定 日本対応済
  • phpunit 9.5.19

問題のあるテストコード

下記のようなテストコードでテストを行っていた

<?php
use Carbon\Carbon

// 中略

public function hogeData() {
    return [
        "テストA" => [new Carbon("2000-01-01 10:00")]
    ];
}

/**
hogeなテスト
@dataProvider hogeData
@param Carbon $_date 日付
*/
public function test_hoge($_dateA)
{
    //中略
    $_dateB = new Carbon("2000-01-01 10:00");
    
    // ここで$_dateAと$_dateBは同じ日時か
    // 判定を行うとfalseとなる!
}

//中略

上記コードで$dateAと$dateBが同一日時か判定すると、falseとなった。

検証

ちょっと意味がよくわからないので、上記コードを下記コードのように変更し、タイムゾーンの確認を行った。

<?php
// 中略
public function hogeData() {
    echo ("A : " . date_default_timezone_get());
    return [
        "テストA" => [new Carbon("2000-01-01 10:00")]
    ];
}

// コメント部略
public function test_hoge($_dateA)
{
    //中略
    echo ("B : " . date_default_timezone_get());
}

//中略

上記のようなコードを実行した結果。

実行部位 タイムゾーン
echo A UTC
echo B Asia/Tokyo

となった。全く意味がわからないが、そういうものらしい。

結論

Carbon変数をdataProvider内に置く場合は、

new Carbon("2000-01-01", "Asia/Tokyo")

としておくほうが安全である。