【发布时间】:2015-11-15 22:22:19
【问题描述】:
我有一个其他人编写的函数,它在函数内部创建了一个 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 调用为这样的函数编写测试。
【问题讨论】:
-
我认为您的解决方案没有任何问题。代码是经过测试的,不是吗? :)
-
是的,但如果我不需要或有更好的方法,我不想实施黑客攻击。
-
真的是 hack。您重组了代码,新代码在设计方面很有意义。
-
100% 的代码覆盖率——包括最琐碎的一个班轮方法?嗯...
-
同意@bayou.io,你的老板需要更深入地了解代码覆盖的真正含义。还要避免单元测试私有函数。出于某种原因,这些方法是私有的。
标签: php dependency-injection phpunit