我正在尝试通过一项涉及运行查询的测试,该查询返回一系列登录以测试测试中两个数组是否相等。
过去,我曾尝试更改查询的格式以通过测试以及编辑数组,最终使其等于两个数组。不幸的是,测试仍然没有通过。
执行查询以获取一系列登录日期的函数:
public function getLogins(): array
{
return $this->createQuery()
->select('date AS datetime, COUNT(id) as total')
->orderBy('datetime', 'DESC')->groupBy('datetime')
->where('date >= -24 hours')
->getQuery()
->getResult();
}
这是测试类中的方法:
public function testGetLogins()
{
$dateLogins = $this->repository->getLogins();
$this->assertCount(4, $dateLogins, "Four instances");
$this->assertEquals([
["datetime" => new \DateTime("now -3 minutes"), "total" => "1"],
["datetime" => new \DateTime("now -7 days"), "total" => "1"],
["datetime" => new \DateTime("now -1 year"), "total" => "1"],
["datetime" => new \DateTime("now -600 days"), "total" => "1"]
], $logins, "The login instances returned match the expected times");
}
我期望测试通过,但它显示以下内容:
期望数组和实际数组都相等,所以我不确定导致测试失败的原因。
答案 0 :(得分:0)
\DateTime
格式还包含有关秒的信息。 new \DateTime("now -3 minutes")
将返回now
减去3 minutes
,但seconds
的确切数量将始终是不同的,具体取决于启动测试的时间。显然,您要比较直到分钟的日期,因此必须在比较之前格式化日期,因此必须分别比较每个集合:
$expectedValues = [
["datetime" => new \DateTime("now -3 minutes"), "total" => "1"],
["datetime" => new \DateTime("now -7 days"), "total" => "1"],
["datetime" => new \DateTime("now -1 year"), "total" => "1"],
["datetime" => new \DateTime("now -600 days"), "total" => "1"]
];
for ($i = 0; $i < count($expectedValues); ++$i) {
$actualDate = (new \DateTime($logins[$i]['datetime']))->format('Y-m-d H:i');
$expectedDate = ($expectedValues[$i]['datetime'])->format('Y-m-d H:i');
$this->assertEquals($expectedDate, $actualDate);
$this->assertEquals($expectedValues[$i]['total'], $logins[$i]['total']);
}