这是一篇关于模拟全局 php 函数的有趣文章。作者提出了一个非常有创意的解决方案,通过覆盖 SUT(被测服务)命名空间内的方法来“模拟”(关闭)全局 php 函数。
time
这里的代码来自博客文章中模拟函数的示例:
<?php
namespace My\Namespace;
use PHPUnit_Framework_TestCase;
/**
* Override time() in current namespace for testing
*
* @return int
*/
function time()
{
return SomeClassTest::$now ?: \time();
}
class SomeClassTest extends PHPUnit_Framework_TestCase
{
/**
* @var int $now Timestamp that will be returned by time()
*/
public static $now;
/**
* @var SomeClass $someClass Test subject
*/
private $someClass;
/**
* Create test subject before test
*/
protected function setUp()
{
parent::setUp();
$this->someClass = new SomeClass;
}
/**
* Reset custom time after test
*/
protected function tearDown()
{
self::$now = null;
}
/*
* Test cases
*/
public function testOneHourAgoFromNoon()
{
self::$now = strtotime('12:00');
$this->assertEquals('11:00', $this->someClass->oneHourAgo());
}
public function testOneHourAgoFromMidnight()
{
self::$now = strtotime('0:00');
$this->assertEquals('23:00', $this->someClass->oneHourAgo());
}
}
不确定这是否是一个好方法,但它肯定效果很好,我认为这里值得一提。可能是一些讨论的食物......