
本文介绍如何在 phpunit 测试中对 mock 方法的参数执行严格引用(`===`)比对,替代冗长的匿名回调,使用内置的 `identicalto()` 断言器实现简洁、可靠的对象身份验证。
在 PHPUnit 的 mock 验证中,with($hosting) 默认使用松散的值相等(==)语义进行匹配——即只要两个对象属性相同、类型一致,即使不是同一实例,测试也会通过。这在验证对象身份(identity)而非状态(state) 的场景下存在严重风险:例如,当被测代码意外创建了新实例(如 new Hosting())而非复用原始对象时,测试仍会误报成功。
幸运的是,PHPUnit 提供了专用于严格引用比较的内置匹配器:self::identicalTo($expected)。它底层调用 PHP 的 === 运算符,确保传入参数与期望对象为同一内存地址的实例,完美替代手动编写闭包回调:
$hosting = new Hosting();
$this->entityManager
->expects($this->once())
->method('persist')
->with(self::identicalTo($hosting)); // ✅ 严格引用比对
$this->persister->persist($hosting); // 测试通过若 persist() 内部错误地使用 new Hosting() 替代 $hosting,该断言将立即失败,并给出清晰的错误信息,例如:
Failed asserting that two variables reference the same object.
? 其他实用匹配器补充(同属 PHPUnit\Framework\Constraint): self::equalTo($value) —— 值相等(默认行为,等价于 with($value)) self::isInstanceOf($class) —— 类型检查 self::isType($type) —— 基础类型检查(如 'string', 'array') self::logicalAnd(...) / self::logicalOr(...) —— 组合条件
最佳实践建议:
动态WEB网站中的PHP和MySQL详细反映实际程序的需求,仔细地探讨外部数据的验证(例如信用卡卡号的格式)、用户登录以及如何使用模板建立网页的标准外观。动态WEB网站中的PHP和MySQL的内容不仅仅是这些。书中还提到如何串联JavaScript与PHP让用户操作时更快、更方便。还有正确处理用户输入错误的方法,让网站看起来更专业。另外还引入大量来自PEAR外挂函数库的强大功能,对常用的、强大的包
立即学习“PHP免费学习笔记(深入)”;
- 当业务逻辑明确依赖对象身份唯一性(如实体管理、事件总线中的消息对象、单例上下文等),务必使用 identicalTo();
- 避免滥用 callback(),它虽灵活但可读性差、调试成本高,且无法提供友好的失败提示;
- 在大型测试套件中,统一使用 identicalTo() 可显著提升 mock 断言的可靠性与可维护性。
综上,self::identicalTo($object) 是 PHPUnit 中实现严格参数引用比对最简洁、标准且健壮的方案。










