CakePHP、日付のモックアップ

CakePHPでテストを書く際、内部に日付に応じて挙動が変化する記述がされている関数のテストをしたい際、 例えば、日付を取得するメソッドとしてFrozenDateなどがテストしたいメソッドの中にいるとき、テスト時は$todayをいろいろと操作して挙動を検証したい状況があります。

以下の関数では日付に応じて出力が変わります。

function getPrettyOpenDay():string {
 $today = new FrozenDate::now();
 if ($today->isSunday()) {
    return "日曜日は定休日です";
 }
 return "営業日";
}

こういう状況で各日付における挙動をテストするスクリプトを書きたい場合、

$now = new FrozenDate('2021-03-26');
FrozenDate::setTestNow($now);

として、$nowに任意の日付を渡すことで、モックアップすることができます。 ただし、テストにこれを書く場合、tearDownする際などに日付をもとに戻さないと後述のテストが影響を受けてしまうので

Time::setTestNow(null);

としましょう。