【问题标题】:PHPUnit Form Test Failing on DateTimePHPUnit 表单测试在 DateTime 上失败
【发布时间】:2018-09-20 18:59:47
【问题描述】:

由于 DateTime 值不同,我的本地机器上有几个单元测试失败:

4) Tests\AppBundle\Form\AssetStatusTypeTest::testValidForm with data set #0 (array('active'))
Failed asserting that two objects are equal.
--- Expected
+++ Actual
@@ @@
     'status' => 'active'
    'type' => null
    'amount' => null
-    'createdAt' => 2018-09-20T20:34:47.047520+0200
+    'createdAt' => 2018-09-20T20:34:47.047870+0200
     'updatedAt' => null
     'contract' => null
     'admin' => null

测试:

public function testValidForm($data)
{
    $form = $this->factory->create(AssetStatusType::class);
    $object = Entity::fromArray(new Asset(), $data);
    $form->submit($data);
    $this->assertTrue($form->isSynchronized());
    $this->assertEquals($object, $form->getData());
    $view = $form->createView();
    $children = $view->children;
    foreach (array_keys($data) as $key) {
        $this->assertArrayHasKey($key, $children);
    }
}

这或多或少是copied from the docs

现在,createdAt 字段设置如下:

public function __construct()
{
    if (empty($this->createdAt)) {
        $this->createdAt = new \DateTime();
    }
}

我的主要观点是:这个测试通过了我们的 Jenkins。它不在几台开发人员机器上本地。我的第一个冲动是检查 ini 时区设置。

我想知道这怎么可能。如果我做对了,预计是在创建 object 时,而实际是在提交表单时。所以两个对象永远不能有相同的createdAt 时间戳。除非precision 可能超低。

【问题讨论】:

    标签: symfony phpunit


    【解决方案1】:

    两台机器运行不同版本的 PHP。 PHP7.1(及更高版本)在创建 DateTime 对象时包含微秒,但在 PHP 5.x 和 7.0 上运行的代码不会。

    有两种处理方法:

    • 不要比较确切的日期时间,而是使用$datetimeObj->format('U'); 将它们转换为秒。当一个测试在 1.99998 创建并且下一次创建日期时间的调用是在 2.0001 时,您仍然会偶尔遇到测试失败,因此当转换为秒时测试仍然会失败。
    • 使用“Clock Mocking”。使用一些有趣的 PHP 命名空间技巧,全局 time() 函数被覆盖(sleep() 也是)。您必须创建新的 DateTime 对象以确保它们实际使用新版本的 time() 函数,但时钟会有效停止 - 并且 sleep() 会变成更像 $time += $seconds; 的东西 - 这也意味着sleep(3600); 的有效时间为零。

    如果您不想将 symfony/phpunit-bridge ClockMock.php 用作一个库,如果您不想将它作为一个监听器包含在您的 PHPunit 配置中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-28
      • 2013-06-11
      • 1970-01-01
      • 2015-10-31
      • 2017-06-24
      • 2013-08-26
      • 1970-01-01
      相关资源
      最近更新 更多