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