2016-05-29 5 views
1

Я тестирую свой проект Symfony2 с помощью PHPUnit. Я хочу высмеять часы сервера при выполнении какого-либо функционального теста.Symfony2 PHPUnit Clock Mocking не работает

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

Смежные вопросы