phpunit中具有受保护方法的抽象类
我一直在尝试在我的抽象类上使用phpunit进行测试,该抽象类包含将由it子类共享的受保护方法。我一直在读关于私有/受保护的方法不应该被测试的文章,因为这会使代码变得脆弱。在这种情况下,我不希望这些方法成为公共API(尽管这不会有什么坏处,感觉有些不对劲),也不希望在每个孩子身上测试是否正确执行了相同的父操作 因此,作为一个例子,我将尝试发布一个简单的例子phpunit中具有受保护方法的抽象类,php,tdd,phpunit,abstract-class,Php,Tdd,Phpunit,Abstract Class,我一直在尝试在我的抽象类上使用phpunit进行测试,该抽象类包含将由it子类共享的受保护方法。我一直在读关于私有/受保护的方法不应该被测试的文章,因为这会使代码变得脆弱。在这种情况下,我不希望这些方法成为公共API(尽管这不会有什么坏处,感觉有些不对劲),也不希望在每个孩子身上测试是否正确执行了相同的父操作 因此,作为一个例子,我将尝试发布一个简单的例子 abstract class AbstractAuthenticator { abstract function authentic
abstract class AbstractAuthenticator
{
abstract function authenticate();
protected function checkUserPrivilege()
{
... code
}
protected function checkEnvPrivileges()
{
... code
}
}
class BasicAuth extends AbstractAuthenticator
{
public function authenticate()
{
$this->checkUserPrivilege();
$this->checkEnvPrivileges();
... code
}
}
class AjaxAuth extends AbstractAuthenticator
{
public function authenticate()
{
$this->checkUserPrivilege();
$this->checkEnvPrivileges();
... code
}
}
我的问题(如果我可以做多个)是:
- 这个代码对你有意义吗
- 应将受保护的方法更改为公共
- 如果受保护的方法是公共的,那么应该在类之外检查它们,还是仍然在
authenticate()中调用它们
- 如果您看到这个api(所有标记为public的方法),您不会对调用哪些方法感到困惑吗
谢谢大家。我认为这个问题很棘手,需要一些视角来研究,所以我很欣赏你的评论创建一个TestAuthence类,并在AbstractAuthenticatorTest中测试受保护的方法,该测试使用它而不是真实的*Auth对象。到目前为止,我已经尝试了ReflectionClasss的建议,这是测试方法的一种方法。真正的问题是:这是测试类行为而不是它的公共api的正确方法吗?在创建了三种访问方法之后,我开始理解,这里真正重要的因素是确保抽象身份验证方法调用在
checkUserPrivilege()
和checkEnvPrivileges()中执行的隐式操作
这只能作为类“tests”中的断言进行检查您必须测试checkUserPrivilege和checkEnvPrivileges是否按预期工作,并在预期时调用它们。前者在AbstractAuthenticatorTest中测试,后者在每个*Auth类测试中测试。也许我错过了什么。gontrollez的Regardstanks。我也有同样的假设。我会检查这是最好的答案