在phpunit中使用受保护方法的抽象类

时间:2014-02-06 23:41:35

标签: php tdd phpunit abstract-class

我一直试图在我的抽象类上使用phpunit进行测试,该类包含将由其子级共享的受保护方法。我一直在阅读关于私有/受保护的方法不应该被测试,因为这会使代码变得脆弱。在这种情况下,我不希望这些方法是公共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(将所有方法都标记为公开),你不会对调用哪些方法感到困惑吗?

谢谢大家。我认为这个问题很棘手,需要一些观点来研究,所以我会评论你的评论

1 个答案:

答案 0 :(得分:0)

创建一个TestAuth类并在AbstractAuthenticatorTest中测试受保护的方法,该方法使用它而不是真正的* Auth对象。