2016-05-29 10 views
1

PHPUnitを使用してSymfony2プロジェクトをテストしています。私はいくつかの機能テストを行うときにサーバーのクロックを嘲笑したい。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が渡されなければなりません。しかし、それは合格しないし、実際の時間は変わらない。 2つの文字列が等しいことをアサートできませんでした。

--- 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

関連する問題