PHPUnit,测试使用根据当前时间设置的类字段的方法

时间:2017-01-01 03:00:58

标签: php laravel phpunit

我正在构建一个具有start()stop()方法的Timer类,每个方法都会设置一个带有当前时间戳的 Carbon 对象,然后我有尝试测试的方法,这个方法将计算时间戳之间的差异,以获得计时器中经过的总秒数。

我有一个问题单元测试这种方法,因为它取决于当前的时间戳,我不认为在测试中放sleep(1)是个好主意,所以,我的问题是,有什么办法可以让这个方法在运行时使用其他两个特定的Carbon实例?

这是我的方法,它使用了来自它的两个受保护的字段endTimestartTime

/**
 * Get the total elapsed time as the difference in seconds
 * between startTime and endTime
 *
 * @return int Number of seconds elapsed
 */
public function getElapsedTime()
{
    if(!$this->endTime)
        return $this->startTime->diffInSeconds(Carbon::now('Europe/Lisbon'));

    return $this->startTime->diffInSeconds($this->endTime);
}

1 个答案:

答案 0 :(得分:0)

我是通过使用Reflection

完成的
/**
 * The elapsedTime method should return a string
 * if both startTime and endTime are defined
 */
public function testElapsedTimeMethod()
{
    $reflection = new \ReflectionClass($this->timer);
    $startTime  = $reflection->getProperty('startTime');
    $endTime    = $reflection->getProperty('endTime');

    $startTime->setAccessible(true);
    $endTime->setAccessible(true);

    $startTime->setValue($this->timer, Carbon::createFromTimestamp(1483240345));
    $endTime->setValue($this->timer, Carbon::createFromTimestamp(1483240348));

    $secondsElapsed = $this->timer->getElapsedTime();

    $this->assertEquals(3, $secondsElapsed);
}