PHPUnit中Mock日志方法时如何断言时间(带容差)或忽略时间字段?
PHPUnit测试日志方法时处理动态时间戳的两种方案
方案一:带容差验证时间戳的合理性
如果需要确认时间戳是合理的(比如是测试执行前后短时间内生成的),可以用$this->callback()自定义验证逻辑,给时间戳设置可接受的容差范围:
$this->logger ->expects($this->once()) ->method('info') ->with( $this->equalTo('Campaign code created'), $this->callback(function ($logData) { // 先验证固定的user_id字段 if ($logData['user_id'] !== 2000) { return false; } // 验证time字段是最近1秒内生成的时间戳(可根据需求调整容差) $currentTimestamp = microtime(true); return $logData['time'] >= $currentTimestamp - 1 && $logData['time'] <= $currentTimestamp + 1; }) );
方案二:完全忽略time字段的检查
如果不需要验证时间戳,只关心其他固定字段是否正确,可以用$this->arrayContaining()来匹配数组中必须包含的键值对,忽略额外字段:
$this->logger ->expects($this->once()) ->method('info') ->with( $this->equalTo('Campaign code created'), $this->arrayContaining(['user_id' => 2000]) );
这个方法会断言传入的日志参数数组包含user_id => 2000,不管time字段的值是什么,只要存在目标键值对就通过验证。
内容的提问来源于stack exchange,提问作者Ratin
相关产品推荐
相关产品推荐

