gpt4 book ai didi

php - 使用 PHPUnit 测试 protected 方法的最佳实践(在抽象类上)

转载 作者:行者123 更新时间:2023-12-02 03:04:02 26 4
gpt4 key购买 nike

使用 PHPUnit 和 PHP >= 5.3 可以测试 protected 方法。 stackoverflow 上的以下页面概述了最佳实践:

"Best practices to test protected methods with PHPUnit"

protected static function callProtectedMethod($name, $classname, $params) {
$class = new ReflectionClass($classname);
$method = $class->getMethod($name);
$method->setAccessible(true);
$obj = new $classname($params);
return $method->invokeArgs($obj, $params);
}

使用 PHPUnit 测试抽象类的公共(public)方法很容易。使用上述方法在普通类上测试 protected 方法很容易。必须以某种方式测试抽象类上的 protected 方法......

我知道 PHPUnit 派生抽象类并在具体类中“实现”抽象方法,并针对该具体类触发测试 - 但我不知道如何将其集成到上面的方法中以进行 callProtectedMethodOnAbstractClasses()。

你是如何进行此类测试的?

PS:问题不在于测试 protected 方法的真实性(参见:白盒测试、灰盒测试和黑盒测试)。测试 protected 方法的需要取决于您的测试策略。

最佳答案

既然您要求“最佳实践”,我将采取不同的方法来回答:

不要测试 protected 和私有(private)方法

仅仅因为你可以,并不意味着你应该这样做。

您想要测试一个类是否有效。这意味着您可以调用的所有函数(所有公共(public)函数)返回正确的值(并且可能对传入的对象调用正确的函数)什么也没有否则。

你不关心这在类中是如何实现的。

恕我直言,为任何非公开的内容编写测试甚至会伤害你,原因有两个:

  • 时间

编写测试需要更长的时间,因为您需要更多的时间,并且重构也需要更长的时间。如果您移动类中的代码而不更改其行为,则不需要更新其测试。测试应该告诉您一切仍然有效!

  • 有意义的代码覆盖率

如果您为每个 protected 方法编写测试,您就会失去从代码覆盖率报告中继承的好处:它不会告诉您哪些 protected 函数不再被调用。这是(恕我直言)一件坏事,因为您要么没有正确测试所有公共(public)方法(如果您测试每种情况,为什么没有调用一个方法?)或者您真的不需要该方法不再,但因为它是“绿色”的,所以你不会再考虑它。

引用 PHPUnit 作者

So: Just because the testing of protected and private attributes and methods is possible does not mean that this is a "good thing".

http://sebastian-bergmann.de/archives/881-Testing-Your-Privates.html

因为现实世界有时会有所不同

...->setAccessible() 对于普通方法来说没问题

对于抽象的东西使用...->getMockForAbstractClass()

但请仅在确实有必要时才这样做。

抽象类中的 protected 方法将通过测试其子级的公共(public) api 来进行测试,无论如何,我的参数都适用。

关于php - 使用 PHPUnit 测试 protected 方法的最佳实践(在抽象类上),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5010300/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com