2015-11-05 43 views
0

我有一个函数,其他人写道,它在函数内部创建一个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

我没有看到你的解决方案有什么问题。代码经过测试,不是吗? :) – ZhongYu

+0

是的,但我不想实施黑客,如果我不需要或者如果有更好的方法。 – Ethan22

+0

它真的是一个黑客。您重构了您的代码,并且新代码在设计方面很有意义。 – ZhongYu

回答

1

我真的会建议重写代码来通过构造函数注入Communicator对象。 如果您已经看到在编写测试中遇到一个大问题,那么重新执行当前的实现是一个非常强烈的信号。

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

完全不同的是我认为你的测试不应该超出系统的界限。那就是 - 嘲笑连接到外部系统的所有东西。从运行测试的唯一角度来看,这种测试可能会因各种原因而失败。

你也提到了报道。不幸的是,这是我希望每个人都会同意的 - 在开始使用原生PHP资源的时候你就不能拥有它(像FS这样的小例外)。你必须明白诸如curl,ssh,ftp等不能被单元测试。