2016-05-29 67 views
1

我正在使用PHPUnit測試我的Symfony2項目。我想在做功能測試時嘲笑服務器的時鐘。Symfony2 PHPUnit時鐘嘲笑不起作用

AuthUserRepositoryTest.php

<?php 
namespace AppBundle\Tests\Entity; 
use AppBundle\Entity\AuthUserRepository; 
use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; 
use \Symfony\Bridge\PhpUnit\ClockMock; 
/** 
* @group time-sensitive 
*/ 
class AuthUserRepositoryTest extends WebTestCase 
{ 
    /** 
    * @var AuthUserRepository 
    */ 
    private $AuthUserRepository; 

    public function setUp() 
    { 
     $kernel = static::createKernel(); 
     $kernel->boot(); 
     $this->AuthUserRepository = $kernel->getContainer() 
      ->get('doctrine.orm.entity_manager') 
      ->getRepository('AppBundle:auth_user'); 
     ClockMock::register(__CLASS__); 
    } 

    /** 
    * @group time-sensitive 
    */ 
    public function test() 
    { 
     ClockMock::withClockMock(true); 

     // Other tests ... 

     // Check whether clock mock was successful 
     $time = $this->AuthUserRepository->getApparentTime(); 
     $this->assertEquals("2016-11-05 01:00:00",$time); 
    } 

    /** 
    * Override time() in current namespace for testing 
    * 
    * @return int 
    */ 
    public static function time() 
    { 
     return "2016-11-05 01:00:00"; 
    } 
    ?> 

AuthUserRepository.php

<?php 
namespace AppBundle\Entity; 
use Doctrine\ORM\EntityRepository; 

class AuthUserRepository extends EntityRepository{ 

    private function getTimeStamp() 
    { 
     return \DateTime::createFromFormat('U', time())->setTimezone(new \DateTimeZone('Asia/Colombo'))->format('Y-m-d H:i:s'); 
    } 

    public function getApparentTime() 
    { 
     return $this->getTimeStamp(); 
    } 

    // Functions to be tested are reduced. 
} 
?> 

如果時鐘嘲諷成功,assertEquals應該過去了。但它沒有通過,實際時間保持不變。 失敗斷言兩個字符串相等。

--- Expected 
+++ Actual 
@@ @@ 
-'2016-11-05 01:00:00' 
+'2016-05-29 16:44:49' 

FAILURES! 
Tests: 9, Assertions: 16, Failures: 1. 

任何意見,以實現願望功能表示讚賞。

我正在關注this教程。

回答

3

使用ClockMock::withClockMock這樣的:

ClockMock::withClockMock(strtotime('2016-11-05 01:00:00')); 

此外,無需重寫time()功能。

+0

謝謝兄弟。完美的作品! – TRiNE