Метод freezeTime
Метод freezeTime применяется в тестах Laravel для заморозки времени.
Он возвращает экземпляр Carbon с зафиксированным моментом времени.
Это позволяет избежать проблем с плавающим временем при тестировании функциональности,
которая зависит от текущей даты и времени, например, сроков действия, расписаний
или временных меток.
Синтаксис
<?php
$this->freezeTime();
?>
Метод не принимает параметров и возвращает объект Carbon,
представляющий замороженное время.
Пример
Давайте протестируем метод, который возвращает текущую дату в отформатированном виде:
<?php
namespace AppHelpers;
use CarbonCarbon;
class DateHelper
{
public static function getCurrentDate()
{
return Carbon::now()->format('Y-m-d');
}
}
?>
<?php
namespace TestsUnit;
use TestsTestCase;
use AppHelpersDateHelper;
class DateHelperTest extends TestCase
{
public function testGetCurrentDate()
{
$frozenTime = $this->freezeTime();
$res = DateHelper::getCurrentDate();
$this->assertEquals($frozenTime->format('Y-m-d'), $res);
}
}
?>
Результат выполнения кода:
"Test passed"
Пример
Протестируем метод, который проверяет, истек ли срок действия токена:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
use CarbonCarbon;
class Token extends Model
{
protected $fillable = ['expires_at'];
public function isExpired()
{
return Carbon::now()->gt($this->expires_at);
}
}
?>
<?php
namespace TestsUnit;
use TestsTestCase;
use AppModelsToken;
use CarbonCarbon;
class TokenTest extends TestCase
{
public function testTokenIsExpired()
{
$frozenTime = $this->freezeTime();
$token = new Token([
'expires_at' => $frozenTime->copy()->subDay()
]);
$this->assertTrue($token->isExpired());
}
public function testTokenIsNotExpired()
{
$frozenTime = $this->freezeTime();
$token = new Token([
'expires_at' => $frozenTime->copy()->addDay()
]);
$this->assertFalse($token->isExpired());
}
}
?>
Результат выполнения кода:
"Test passed"
"Test passed"
Пример
Протестируем метод, который создает записи с временными метками:
<?php
namespace AppModels;
use IlluminateDatabaseEloquentModel;
use CarbonCarbon;
class Post extends Model
{
protected $fillable = ['title', 'content', 'scheduled_at'];
public static function scheduleForToday($title, $content)
{
return self::create([
'title' => $title,
'content' => $content,
'scheduled_at' => Carbon::now()
]);
}
}
?>
<?php
namespace TestsUnit;
use TestsTestCase;
use AppModelsPost;
use IlluminateFoundationTestingRefreshDatabase;
class PostTest extends TestCase
{
use RefreshDatabase;
public function testScheduleForToday()
{
$frozenTime = $this->freezeTime();
$post = Post::scheduleForToday('Test Title', 'Test Content');
$this->assertDatabaseHas('posts', [
'title' => 'Test Title',
'scheduled_at' => $frozenTime->toDateTimeString()
]);
}
}
?>
Результат выполнения кода:
"Test passed"