【发布时间】:2015-07-29 19:34:17
【问题描述】:
我正在使用 phpunit。但是你知道它的困难,不可能模拟私有函数,访问私有变量等。有什么工具可以帮助我吗?将私有函数变为公共函数,将静态方法变为可模拟等的东西
【问题讨论】:
-
访问类的私有函数和方法的需要表明你做错了(测试或测试的类或两者)。测试类的接口(即公共方法)。你不能关心它完成工作的内部方式。
标签: phpunit
我正在使用 phpunit。但是你知道它的困难,不可能模拟私有函数,访问私有变量等。有什么工具可以帮助我吗?将私有函数变为公共函数,将静态方法变为可模拟等的东西
【问题讨论】:
标签: phpunit
不直接回答您的问题,但使 phpunit 更容易的最佳“工具”是良好的代码设计。如果您不确定针对给定问题的好的设计是什么,那么您已经在使用另一个可用的好工具 - 这个网站。
您在问题中提到的导致困难的事情通常很困难,因为您的代码设计存在问题。如果很难测试,就很难重构、使用和维护。测试会在编码过程的早期向您展示这一点,并允许您进行更改以使您未来的自己免受问题的影响。
例如在您的问题中遇到的困难:
模拟私有函数 - 这是一种气味,有第二个 需要创建的类。您的对象可能违反了 单一职责原则。这个功能应该是 移动到自己的对象中并传递给被测系统。
访问私有变量 - PHPUnit 确实有对象的断言 属性 (assertAttributeEquals, etc.)。不过这真的 不是您应该使用的东西。私有变量是 你的对象的实现细节,应该有某种 可用于验证正确信息的公共方法 已设置(getter 或依赖注入模拟对象)
模拟静态方法 - 关于这个有很多问题 困难和许多资源说静态方法不好 设计。如果你需要模拟一个静态方法,那意味着你是 影响全局状态。静态方法也隐藏了依赖 来自您对象的用户,并使事情难以修改。您的 设计变得不那么灵活,而且更加模块化。
【讨论】:
哟不需要测试私有方法和属性。它们是私有的是有原因的,并且只有在从持有它们的类内部调用时才有意义。而且,如果你测试一个公共方法,你也在间接测试它调用的私有方法,而公共函数的结果也可能取决于一些私有属性,你也在用公共方法测试。
如果您测试一个类的所有公共方法(即它的接口),我的意思是对这些方法的完整代码/分支覆盖,那么您正在测试所有需要的私有方法/属性>。如果在测试完所有公共内容后,您还剩下一些未达到的代码,那么您可以安全地删除该代码,因为它没有用。
【讨论】: