模拟 DateTime 的所有实例用于测试目的的时间

2022-08-30 17:11:35

我希望能够在 PHPUnit 或 Behat 测试期间为每个实例化实例设置时间。DateTime

我正在测试与时间相关的业务逻辑。例如,类中的方法仅返回过去或将来的事件。

如果可能的话,我不想做:

  1. 围绕它编写一个包装器,而不是在我的代码中使用它。这将涉及对我当前代码库的一些重写。DateTimeDateTime

  2. 每次运行测试/套件时动态生成数据集。

所以问题是:是否有可能覆盖s行为,以便在请求时始终提供特定的时间?DateTime


答案 1

您应该在测试中存根所需的方法以返回预期值。DateTime

$stub = $this->getMock('DateTime');
$stub->expects($this->any())
     ->method('theMethodYouNeedToReturnACertainValue')
     ->will($this->returnValue('your certain value'));

查看 https://phpunit.de/manual/current/en/test-doubles.html

如果由于方法已硬编码到代码中而无法存根,请查看

它解释了如何在调用时调用回调。然后,可以将 DateTime 类替换为具有固定时间的自定义 DateTime 类。另一种选择是使用 http://antecedent.github.io/patchworknew


答案 2

你也可以使用时间旅行者lib,它使用aop php pecl扩展来带来类似于红宝石猴子补丁的东西 https://github.com/rezzza/TimeTraveler

还有这个php扩展,灵感来自ruby timecop one:https://github.com/hnw/php-timecop


推荐