我有一个其他人写的函数,它在函数内部创建了一个cURL包装器对象。
下面的简化版本public function getCodes()
{
//do some stufff
$communicator = new Communicator();
$result = $communicator->call($this->API_KEY);
//do some stuff with $result
}
我的任务是学习PHPUnit并为这类代码编写测试。在这样做的过程中,我发现当在函数内部创建对象并且测试不需要任何外部通信工作时,测试这样的函数真的很难。
我们希望将测试推送到git,就像许多项目一样,但我们并不想意外或故意将我们的API凭据推送到git。
所以我的解决方案是保持getCodes()公共,但使其成为接受Communicator对象作为参数的私有函数的包装器。然后我可以使用模拟Communicator对象测试私有方法。
但这意味着getCodes从未经过测试(我的老板想要100%的代码覆盖率)而且我还读到在大多数情况下你不应该为私人函数编写测试。
所以我的问题基本上是,如何通过API调用为这样的函数编写测试。
答案 0 :(得分:1)
我真的建议重写代码以通过构造函数注入Communicator对象。 如果你已经看到为某些东西编写测试存在一个很大的问题,那么重新解决当前的实现是一个非常强烈的信号。
另一件事是你不应该测试你的私人。塞巴斯蒂安·贝格曼(Sebastian Bergmann)不久前在他的博客上写了一篇关于这个的文章,结论是 - 它可能不好(https://sebastian-bergmann.de/archives/881-Testing-Your-Privates.html)。
完全不同的是,我认为您的测试不应该超出系统的范围。那就是 - 模拟连接到外部系统的所有东西。从运行测试的唯一角度看,这些测试可能因各种原因而失败。
您还提到了报道。不幸的是,这是我希望每个人都同意的事情 - 你开始使用本机PHP资源时就不能拥有它(有一些像FS这样的小例外)。您必须了解curl,ssh,ftp等内容无法进行单元测试。