我每周都有一份报告。该类基本上看起来像这样(伪代码):
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
- 类,但为什么不只是有一个独立的函数?
答案 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(或新类)的单元测试,那么你可以将它重构为更小的方法并验证它是否仍然可以通过测试。