单元测试报告脚本

时间:2015-06-16 07:40:13

标签: php unit-testing

我每周都有一份报告。该类基本上看起来像这样(伪代码):

class mailreport {
  public function exec() {
     users = Users::getAll();
     for u in users {
        r = this.generateReportData(u);
        m = this.generateMail(r);
        sendMail(u, m);
     }
  } 

  protected generateReport(User u) {
     // do lots of calculation, return report
  }

  // ...
}

此报告中的大多数错误都在generateReport - 方法中。它还进行了许多非常“纯粹”的计算,并且如果不受保护则很容易进行单元测试。 exec - 方法很难测试,因为它有多个依赖项,输出是带有HTML的已发送电子邮件。

我应该如何突破generateReport - 方法,以便我可以更轻松地进行单元测试?我当然可以使用公共Report方法创建某种generate - 类,但为什么不只是有一个独立的函数?

1 个答案:

答案 0 :(得分:0)

从技术上讲,您可以使用以下语法对PHPUnit中的受保护方法进行单元测试:

$object = new MailReport();
$reflection = new \ReflectionClass(get_class($object));
$method = $reflection->getMethod('generateReport');
$method->setAccessible(true);

return $method->invokeArgs($object, [new User()]);

但是,如果你的课程在一种方法中做得太多,那么打破它可能是一个好主意。如果你可以获得覆盖大部分generateReport(或新类)的单元测试,那么你可以将它重构为更小的方法并验证它是否仍然可以通过测试。