Can I “Mock” time in PHPUnit?

后端 未结 11 515
梦谈多话
梦谈多话 2020-11-29 01:53

... not knowing if \'mock\' is the right word.

Anyway, I have an inherited code-base that I\'m trying to write some tests for that are time-based. Trying not to be <

11条回答
  •  不知归路
    2020-11-29 02:10

    Using [runkit][1] extension:

    define('MOCK_DATE', '2014-01-08');
    define('MOCK_TIME', '17:30:00');
    define('MOCK_DATETIME', MOCK_DATE.' '.MOCK_TIME);
    
    private function mockDate()
    {
        runkit_function_rename('date', 'date_real');
        runkit_function_add('date','$format="Y-m-d H:i:s", $timestamp=NULL', '$ts = $timestamp ? $timestamp : strtotime(MOCK_DATETIME); return date_real($format, $ts);');
    }
    
    
    private function unmockDate()
    {
        runkit_function_remove('date');
        runkit_function_rename('date_real', 'date');
    }
    

    You can even test the mock like this:

    public function testMockDate()
    {
        $this->mockDate();
        $this->assertEquals(MOCK_DATE, date('Y-m-d'));
        $this->assertEquals(MOCK_TIME, date('H:i:s'));
        $this->assertEquals(MOCK_DATETIME, date());
        $this->unmockDate();
    }
    

提交回复
热议问题