我正在构建一个具有start()
和stop()
方法的Timer类,每个方法都会设置一个带有当前时间戳的 Carbon 对象,然后我有尝试测试的方法,这个方法将计算时间戳之间的差异,以获得计时器中经过的总秒数。
我有一个问题单元测试这种方法,因为它取决于当前的时间戳,我不认为在测试中放sleep(1)
是个好主意,所以,我的问题是,有什么办法可以让这个方法在运行时使用其他两个特定的Carbon实例?
这是我的方法,它使用了来自它的两个受保护的字段endTime
和startTime
。
/**
* 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);
}
答案 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);
}