php - Symfony2 PHPUnit 时钟模拟不起作用

标签 php unit-testing symfony

我正在使用 PHPUnit 测试我的 Symfony2 项目。我想在进行一些功能测试时模拟服务器的时钟。

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教程。

最佳答案

像这样使用ClockMock::withClockMock:

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

此外,无需重写 time() 函数。

关于php - Symfony2 PHPUnit 时钟模拟不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37509491/

相关文章:

php - 在不相关的类中进行静态方法调用的替代方法是什么?

php - 如何检查用户使用 php 观看了多少视频流

css - 使用 {{form_label()}} 在表单前面的文本列

php - Symfony2 : Routing priority

ajax - 对 Controller 的简单 AJAX 请求 - Symfony3

javascript - 带有双引号的 json_encode 传递到 JSON.parse

python - PyCharm 无法连接到 GhostDriver

android - 单元测试我无法将 Observer 添加到 LiveData NullPointerException

node.js - 模拟 Node.js 中测试的特定读取文件错误

javascript - 为什么我的 test_loc.php 会自行重新加载