これは、グローバル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());
}
}
これが良い方法かどうかはわかりませんが、確かにうまく機能しているので、ここで言及する価値があると思います。議論のための食べ物かもしれません...