php - 单元测试包含 DateTime ("now"的函数)

标签 php codeigniter unit-testing datetime phpunit

我有一个类似这样的函数:

public function getSomeInfo($id){
    $date_start=new DateTime();
    $day_of_week=$date_start->format("N");
    $date_start=$date_start->sub(new DateInterval("P".$day_of_week."D"));
    $date_end=new $date_start;
    $date_end=$date_end->add(new DateInterval("P5D"));
    $date_start=$date_start->format("Y-m-d");
    $date_end=$date_end->format("Y-m-d");
    $sql="SELECT * FROM `table`  
            WHERE `table`.`id`=$id
            AND `session`.`date`>'$date_start'
            AND `session`.`date`<='$date_end'";
    $this->db->query($sql);
}

它返回本周的数据集,基本上是从表中选择日期介于上周一和本周日之间的记录。

我希望能够对此进行单元测试,但我不知道如何在它启动 DateTime 构造函数时执行此操作。这将是当前一周,但实际上出于测试目的,我只希望测试数据集中有一周的数据,所以我真的希望测试 DateTime 每次都是相同的日期。

基本上我如何每次都将 DateTime("now") 设置为相同的模拟日期。我正在使用 PHP、Codeigniter 和 PHPUnit/CIUnit(隐含在标签中)。

最佳答案

您可以改为将 $date_start 变量传递给函数,当您在测试中调用它时,每次都会相同,即

function testMymethod(){
   $date_start = new DateTime('2011-01-01');
   $class->getSomeInfo($id, $date_start);
   //assertions
}

并且您的方法签名将更改为:

    class myclass {
      public function getSomeInfo($id, $date_start = new DateTime()){...}
    }

关于php - 单元测试包含 DateTime ("now"的函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22024576/

相关文章:

java - 如何在 spring boot 应用程序中每次 JUnit 测试后释放端口号?

php - MySQL:根据同一表的一条记录中的一个选定字段中的值删除表中的多行

php - 使用接受序列化对象作为值的 PDO 将模式对象动态存储到数据库的函数

php - mysql 按字母排序输出但得到 ASC?

codeigniter - Codeigniter 3 中使用不同数据库的表单验证

使用 faker 进行 python 假设单元测试

javascript - 如何引用另一个元素的数据属性?

codeigniter - 如何在codeigniter中循环插入数据到数据库?

php - 将日期转换为与之前在 Codeigniter 中相同的格式

javascript - 在 Nightwatch 中运行 "traditional"单元测试