snicco/testable-clock

v2.0.0-beta.9 2024-09-07 14:27 UTC

README

codecov Psalm Type-Coverage Psalm level PhpMetrics - Static Analysis PHP-Versions

TestableClock 组件是 Snicco 项目 的一部分,它将代码与 DateTimeImmutable 解耦,以便能够正确地进行测试。

安装

composer require snicco/testable-clock

用法

在您的代码中,您可以使用 Clock 接口 代替直接使用 DateTimeImmutabletime()

use Snicco\Component\TestableClock\Clock;
use Snicco\Component\TestableClock\SystemClock;
use Snicco\Component\TestableClock\TestClock;

class IsTrialExpired {
    
    private  Clock $clock;
    
    public function __construct(Clock $clock) {
        $this->clock = $clock;
    }
        
    public function __invoke(object $trial) {
        return $trial->expiresAt > $this->clock->currentTimestamp();
    }
        
}

// In production code
$clock = SystemClock::fromUTC();

// or
$clock = new SystemClock(new DateTimeZone('Europe/Berlin'));

$is_trial_expired = new IsTrialExpired($clock)

// In test code
$test_clock = new TestClock();

$is_trial_expired = new IsTrialExpired($test_clock)

TestClock 是固定的,这意味着它总是返回相同的时间戳。

您可以前进时钟或回到过去。

use Snicco\Component\TestableClock\TestClock;

$clock = new TestClock();

$time_0 = $clock->currentTimestamp();

var_dump(time() === $time_0); // true

sleep(10);

$time_01 = $clock->currentTimestamp();

var_dump($time_01 === $time_0); // true
var_dump(time() === $time_01); // false

$clock->travelIntoFuture(10);

$time_02 = $clock->currentTimestamp();

var_dump(time() === $time_02); // true

$time_03 = $clock->travelIntoPast(10);

var_dump($time_03 === $time_01); // true 

贡献

此存储库是 Snicco 项目 开发存储库的只读分支。

以下是如何进行贡献的方法.

报告问题和发送拉取请求

请在 Snicco 单一存储库 中报告问题。

安全

如果您发现安全漏洞,请遵循我们的 披露程序