功能结构与单元测试私有功能

时间:2015-11-05 20:24:48

标签: php dependency-injection phpunit

我有一个其他人写的函数,它在函数内部创建了一个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调用为这样的函数编写测试。

1 个答案:

答案 0 :(得分:1)

我真的建议重写代码以通过构造函数注入Communicator对象。 如果你已经看到为某些东西编写测试存在一个很大的问题,那么重新解决当前的实现是一个非常强烈的信号。

另一件事是你不应该测试你的私人。塞巴斯蒂安·贝格曼(Sebastian Bergmann)不久前在他的博客上写了一篇关于这个的文章,结论是 - 它可能不好(https://sebastian-bergmann.de/archives/881-Testing-Your-Privates.html)。

完全不同的是,我认为您的测试不应该超出系统的范围。那就是 - 模拟连接到外部系统的所有东西。从运行测试的唯一角度看,这些测试可能因各种原因而失败。

您还提到了报道。不幸的是,这是我希望每个人都同意的事情 - 你开始使用本机PHP资源时就不能拥有它(有一些像FS这样的小例外)。您必须了解curl,ssh,ftp等内容无法进行单元测试。