【发布时间】: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 可能超低。
【问题讨论】: