Php 我应该创建额外的函数以使代码可测试吗?

Php 我应该创建额外的函数以使代码可测试吗?,php,unit-testing,testing,phpunit,Php,Unit Testing,Testing,Phpunit,我正在创建一个应用程序,它根据运行的日期创建不同的报告 因此,如果是周一凌晨1点,它将创建一份周报;如果是本月1日凌晨1点30分,它将创建一份月报 我最初的方法使用一个类。它有一个数组属性,将每个报表映射到一个函数。调用脚本调用类上的run()方法,该方法依次遍历数组并为每个报告调用函数 我如何测试这个?我想要一套像样的单元测试来涵盖计算 我是否为每个报表创建两个函数?一个从数据库获取数据,另一个进行计算(可以通过params进行测试)。不过,这似乎太冗长了!我将有24个函数,而不是12个 困惑

我正在创建一个应用程序,它根据运行的日期创建不同的报告

因此,如果是周一凌晨1点,它将创建一份周报;如果是本月1日凌晨1点30分,它将创建一份月报

我最初的方法使用一个类。它有一个数组属性,将每个报表映射到一个函数。调用脚本调用类上的run()方法,该方法依次遍历数组并为每个报告调用函数

我如何测试这个?我想要一套像样的单元测试来涵盖计算

我是否为每个报表创建两个函数?一个从数据库获取数据,另一个进行计算(可以通过params进行测试)。不过,这似乎太冗长了!我将有24个函数,而不是12个

困惑于这样做的最佳方式

谢谢


编辑:为了澄清这一点,脚本由cron作业在上述特定时间运行。我已经使用反射测试了时间检查代码(它根据时间设置运行模式)。我正在考虑将日期全部从类中删除,并让调用脚本定义正在运行的报表。

虽然计算当前日期很简单,但我会将其从函数中分离出来,这样您就可以在不更改代码的情况下测试日期的不同值

我想到了两个选择

  • 使其成为函数的参数。因此,您可以通过使用不同的值调用函数来测试它。这样,就不必等到特定的时间来测试代码。然后,通过使用不同的日期参数调用主代码来进行单元测试
  • 将日期逻辑设为单独的函数,以便可以单独测试该日期逻辑。然后,让函数调用日期逻辑代码
    虽然计算当前日期很简单,但我会将其从函数中分离出来,这样您就可以在不更改代码的情况下测试日期的不同值

    我想到了两个选择

  • 使其成为函数的参数。因此,您可以通过使用不同的值调用函数来测试它。这样,就不必等到特定的时间来测试代码。然后,通过使用不同的日期参数调用主代码来进行单元测试
  • 将日期逻辑设为单独的函数,以便可以单独测试该日期逻辑。然后,让函数调用日期逻辑代码
    虽然计算当前日期很简单,但我会将其从函数中分离出来,这样您就可以在不更改代码的情况下测试日期的不同值

    我想到了两个选择

  • 使其成为函数的参数。因此,您可以通过使用不同的值调用函数来测试它。这样,就不必等到特定的时间来测试代码。然后,通过使用不同的日期参数调用主代码来进行单元测试
  • 将日期逻辑设为单独的函数,以便可以单独测试该日期逻辑。然后,让函数调用日期逻辑代码
    虽然计算当前日期很简单,但我会将其从函数中分离出来,这样您就可以在不更改代码的情况下测试日期的不同值

    我想到了两个选择

  • 使其成为函数的参数。因此,您可以通过使用不同的值调用函数来测试它。这样,就不必等到特定的时间来测试代码。然后,通过使用不同的日期参数调用主代码来进行单元测试
  • 将日期逻辑设为单独的函数,以便可以单独测试该日期逻辑。然后,让函数调用日期逻辑代码
    在尝试测试代码时,您总是会发现自己处于以下情况:一个类有很多我想测试的私有函数

    你所说的“额外”功能,它们不是。只是,如果您希望能够测试某些代码,它通常必须能够从测试中访问,并且可能以单独类的形式访问

    这是我将遵循的结构:

    class ReportGenerator
    {
        private $calculator;
    
        public function __construct(ReportCalculator $calculator)
        {
            $this->calculator = $calculator;
        }
    
        public function generate()
        {
             $calculation_method = $this->computeCalculationMethod();
             return $this->calculator->$calculation_method();
        }
    
        private function computeCalculationMethod()
        {
             switch ($week_day) {
                 ...
             }
             return $method;
        }
    }
    
    class ReportCalculator
    {
         public function calculation1()
         {
    
         }
    
         public function calculationN()
         {
    
         } 
    }
    
    因此,计算是使用一个易于测试的类完成的

    为了测试每个星期天是否调用了正确的方法,在测试中创建ReportGenerator时插入ReportCalculator类的模拟,并检查是否针对每种情况进行了正确的调用


    您还必须控制测试中的当前工作日。这可以通过使用DateProvider类来完成,您也可以模拟它,或者使用其他一些技巧,如命名空间重写。

    在尝试测试代码时,您总是会发现自己处于以下类型的情况:一个类有很多我想测试的私有函数

    你所说的“额外”功能,它们不是。只是,如果您希望能够测试某些代码,它通常必须能够从测试中访问,并且可能以单独类的形式访问

    这是我将遵循的结构:

    class ReportGenerator
    {
        private $calculator;
    
        public function __construct(ReportCalculator $calculator)
        {
            $this->calculator = $calculator;
        }
    
        public function generate()
        {
             $calculation_method = $this->computeCalculationMethod();
             return $this->calculator->$calculation_method();
        }
    
        private function computeCalculationMethod()
        {
             switch ($week_day) {
                 ...
             }
             return $method;
        }
    }
    
    class ReportCalculator
    {
         public function calculation1()
         {
    
         }
    
         public function calculationN()
         {
    
         } 
    }
    
    因此,计算是使用一个易于测试的类完成的

    为了测试每个星期天是否调用了正确的方法,在测试中创建ReportGenerator时插入ReportCalculator类的模拟,并检查是否针对每种情况进行了正确的调用


    您还必须控制测试中的当前工作日。这可以通过使用DateProvider类来完成,您也可以模拟它,或者使用其他一些技巧,如命名空间重写。

    在尝试测试代码时,您总是会发现自己处于以下类型的情况:一个类有很多我想测试的私有函数

    你所说的“额外”功能,它们不是。只是,如果您希望能够测试某些代码,它通常必须能够从测试中访问,并且可能以单独类的形式访问

    这是我将遵循的结构:

    class ReportGenerator
    {
        private $calculator;
    
        public function __construct(ReportCalculator $calculator)
        {
            $this->calculator = $calculator;
        }
    
        public function generate()
        {
             $calculation_method = $this->computeCalculationMethod();
             return $this->calculator->$calculation_method();
        }
    
        private function computeCalculationMethod()
        {
             switch ($week_day) {
                 ...
             }
             return $method;
        }
    }
    
    class ReportCalculator
    {
         public function calculation1()
         {
    
         }
    
         public function calculationN()
         {
    
         } 
    }
    
    那么calc呢