Laravelで最終ログイン時間などの更新日時をテストする方法

ユーザーの最終ログイン時間や記事の投稿、更新時間など今の日時がデータベースに保存される場合は多々あると思います。
今の日時がデータベースに保存された場合は、日時が動的になるため固定値でテストをすることができません。そのような時のテスト方法を紹介します。

下記の手順を実施して最終更新日時をテストします。
①最終更新日が更新される処理を実行。
②処理実行後にDBから対象のレコードを取得
③対象レコードが現在から1秒以内であることを確認する

テストするモデルクラス

// Userモデル
protected $fillable = [
    'name',
    'email',
    'password',
    'last_login_at',
];

テストで検証する

/**
 * @test
 * @return void
 */
public function post_login() {
    $response = $this->post('/login', [
        'login' => 'User@mailaddress.com',
        'password' => 'password',
    ]);

    $response->assertStatus(302)->assertRedirect('/');
    $this->assertAuthenticated();

    // データベースからユーザーを取得
    $user = User::find(1);

    // 現在の時間との差が1秒以内であることを確認
    $this->assertNotNull($user->last_login_at);
    $this->assertTrue(
        $user->last_login_at->diffInSeconds(now()) <= 1,
        'Last login timestamp was not updated correctly.'
    );
}

解説

1. assertNotNull:

• last_login_atがnullでないことを確認。
• ログイン後に値が更新されていることを担保。

2. diffInSeconds:

• 現在の時間との差分を秒単位で計算。
• 一致する必要はないが、許容範囲内(例: 1秒以内)に収まるかを確認。
• CarbonのdiffInSecondsメソッドを利用。

見て触れて学ぶネット詐欺体験サービス「にせサギ」

にせサギはネットサギを安全に体験できるサービスです。
子供・高齢者・障害者、誰もが安全にインターネットを使える社会を目指しています。
解説の小冊子や教え方や授業案を記載した資料も無料で配布しています!

https://nisesagi.com

関連記事

ページ上部へ戻る