You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHPUnit中Doctrine time_immutable类型Mock测试异常求助

解决PHPUnit Mock Doctrine time_immutable类型的问题

问题核心

测试时直接用字符串(纯时间或带日期的datetime)Mock time_immutable类型属性,未经过Doctrine的类型转换逻辑,导致数据库层或Doctrine类型转换报错;生产环境中Doctrine会自动处理DateTimeImmutable对象与数据库时间格式的转换,因此运行正常。

可行解决方案

1. Mock时使用DateTimeImmutable对象而非字符串

无论是设置实体属性还是Mock对象返回值,直接传递DateTimeImmutable实例,让Doctrine自动完成类型转换:

// 设置实体属性示例
$startTime = new \DateTimeImmutable('09:00:00');
$yourEntity->setStartTime($startTime);

// PHPUnit Mock对象返回值示例
$mockEntity = $this->createMock(YourEntity::class);
$mockEntity->method('getStartTime')
    ->willReturn(new \DateTimeImmutable('09:00:00'));

2. 功能测试通过EntityManager操作数据库

如果测试需要插入数据库,不要手动拼接SQL语句,用Doctrine的EntityManager持久化实体,确保类型转换由Doctrine处理:

$startTime = new \DateTimeImmutable('09:00:00');
$yourEntity = new YourEntity();
$yourEntity->setStartTime($startTime);

$this->entityManager->persist($yourEntity);
$this->entityManager->flush();

3. 无需修改数据库配置(可选)

若测试环境数据库启用严格模式(如MySQL的STRICT_TRANS_TABLES),直接插入纯时间字符串可能报错,但通过Doctrine处理即可避免,无需调整数据库配置。

为什么改datetimetz_immutable能运行

datetimetz_immutable类型兼容带日期的datetime字符串,Doctrine可完成转换,但这不符合仅存储时间的需求,因此不推荐。

内容的提问来源于stack exchange,提问作者Piotr Migdał

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 03:42:15