phpunit中具有受保护方法的抽象类

phpunit中具有受保护方法的抽象类,php,tdd,phpunit,abstract-class,Php,Tdd,Phpunit,Abstract Class,我一直在尝试在我的抽象类上使用phpunit进行测试,该抽象类包含将由it子类共享的受保护方法。我一直在读关于私有/受保护的方法不应该被测试的文章,因为这会使代码变得脆弱。在这种情况下,我不希望这些方法成为公共API(尽管这不会有什么坏处,感觉有些不对劲),也不希望在每个孩子身上测试是否正确执行了相同的父操作 因此,作为一个例子,我将尝试发布一个简单的例子 abstract class AbstractAuthenticator { abstract function authentic

我一直在尝试在我的抽象类上使用phpunit进行测试,该抽象类包含将由it子类共享的受保护方法。我一直在读关于私有/受保护的方法不应该被测试的文章,因为这会使代码变得脆弱。在这种情况下,我不希望这些方法成为公共API(尽管这不会有什么坏处,感觉有些不对劲),也不希望在每个孩子身上测试是否正确执行了相同的父操作

因此,作为一个例子,我将尝试发布一个简单的例子

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。我也有同样的假设。我会检查这是最好的答案