函数结构 vs 单元测试私有函数
Function Structure vs Unit Testing Private Function
我有一个别人写的函数,它在函数内部创建一个 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() public,但使其成为接受 Communicator 对象作为参数的私有函数的包装器。然后我可以使用模拟 Communicator 对象测试私有方法。
但这意味着 getCodes 永远不会被测试(我的老板想要 100% 的代码覆盖率)而且我还读到在大多数情况下你不应该为私有函数编写测试。
所以我的问题基本上是,如何通过 API 调用为这样的函数编写测试。
我真的建议重写代码以通过构造函数注入 Communicator 对象。
如果您已经发现为某些东西编写测试存在一个大问题,那么这是一个非常强烈的信号,需要重新调整当前的实现。
另一件事是你不应该测试你的隐私。塞巴斯蒂安·伯格曼 (Sebastian Bergmann) 前段时间在他的博客上写了一篇 post 关于这个的文章,结论是 - 可能只是不好 (https://sebastian-bergmann.de/archives/881-Testing-Your-Privates.html)。
完全不同的是,我认为您的测试不应该超出系统的范围。那就是——模拟所有连接到外部系统的东西。由于各种原因,此类测试可能会失败,但从 运行 测试的唯一角度来看, 中的任何一种都无效。
您还提到了报道。不幸的是,我希望每个人都会同意这一点——你不能在你开始使用原生 PHP 资源的那一刻就拥有它(除了一些小的例外,比如 FS)。你要明白curl, ssh, ftp 等等是不能进行单元测试的
我有一个别人写的函数,它在函数内部创建一个 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() public,但使其成为接受 Communicator 对象作为参数的私有函数的包装器。然后我可以使用模拟 Communicator 对象测试私有方法。
但这意味着 getCodes 永远不会被测试(我的老板想要 100% 的代码覆盖率)而且我还读到在大多数情况下你不应该为私有函数编写测试。
所以我的问题基本上是,如何通过 API 调用为这样的函数编写测试。
我真的建议重写代码以通过构造函数注入 Communicator 对象。 如果您已经发现为某些东西编写测试存在一个大问题,那么这是一个非常强烈的信号,需要重新调整当前的实现。
另一件事是你不应该测试你的隐私。塞巴斯蒂安·伯格曼 (Sebastian Bergmann) 前段时间在他的博客上写了一篇 post 关于这个的文章,结论是 - 可能只是不好 (https://sebastian-bergmann.de/archives/881-Testing-Your-Privates.html)。
完全不同的是,我认为您的测试不应该超出系统的范围。那就是——模拟所有连接到外部系统的东西。由于各种原因,此类测试可能会失败,但从 运行 测试的唯一角度来看, 中的任何一种都无效。
您还提到了报道。不幸的是,我希望每个人都会同意这一点——你不能在你开始使用原生 PHP 资源的那一刻就拥有它(除了一些小的例外,比如 FS)。你要明白curl, ssh, ftp 等等是不能进行单元测试的