这是我思考了很久的事情 - 然后我意识到我的问题!我专注于时间,好像它是我无法控制和衡量的。时间就像我们的应用程序中发生的任何其他计算一样。因此,基于时间的测试很容易——我们只需要改变思考方式——以及我们构建应用程序的方式。
首先,要做的第一件事是将当前的时间生成序列分离到一个方法中。这样,我们可以稍后模拟它(即生成我们自己的方法,该方法总是返回预定的“时间”进行测试)。这可以很简单,例如...
protected function _getCurrentTime()
{
return time();
}
有什么好处:在我们的代码中,我们将调用它来获取当前时间来进行计算。但是,在测试中,我们总是可以生成完全相同的时间。
这很重要 - 我们总是可以每次都生成完全相同的时间。
现在,我不完全确定如何在您的特定应用程序中实现这一点,但让我解释一下“假”应用程序 - 看看您是否可以根据您的规范对其进行调整。
好的,首先,我们有一个方法可以在我们的数据库中放置一个条目,该条目是从现在起 3 周内的“提醒”。
这是旧代码
public function addReminderToDB()
{
$this->_executeSQL('insert into mytable values (1,2,date_add(now(), interval 3 week))');
}
那么,我们如何测试呢?明明每次都不一样?
好吧,让我们分手吧。这是我们的新代码...
新代码
public function addReminderToDB()
{
$currentDate = date('m-d-Y h:i:s', $this->_getCurrentTime());
$sql = "insert into mytable values (1,2,date_add('{$currentDate}', interval 3 week))";
$this->_executeSQL($sql);
}
现在,当涉及到测试...您可以设置您的测试数据库。接下来,模拟 _getCurrentTime() 方法以始终返回您知道的整数。然后,运行 addReminderToDB() (它将使用您知道的整数)。最后,查询数据源以验证插入的行是否具有您期望的正确值。
我知道这与您的问题并不完全一致,但问题也有点模糊:-/ 祝您好运!