使用PHPUnit测试受保护方法的最佳实践

我发现了关于你是否测试私有方法信息的讨论。

我已经决定,在一些课堂上,我想要有受保护的方法,但是要测试它们。 其中一些方法是静态的和简短的。 因为大多数公共方法都使用它们,所以我可能会稍后安全地移除测试。 但是从TDD方法开始并避免调试,我真的想要测试它们。

我想到了以下几点:

  • 方法对象在答案中的建议似乎是矫枉过正的。
  • 从公共方法开始,当代码覆盖率由更高级别的测试给出时,将它们保护起来并移除测试。
  • 继承一个带有可测试接口的类,使受保护的方法公开
  • 最佳做法是什么? 还有别的事吗?

    看起来,JUnit会自动将受保护的方法更改为公开,但我没有深入了解它。 PHP不允许通过反射。


    如果您将PHP5(> = 5.3.2)与PHPUnit一起使用,那么可以使用反射将它们设置为在运行测试之前公开,以测试您的私有和受保护的方法:

    protected static function getMethod($name) {
      $class = new ReflectionClass('MyClass');
      $method = $class->getMethod($name);
      $method->setAccessible(true);
      return $method;
    }
    
    public function testFoo() {
      $foo = self::getMethod('foo');
      $obj = new MyClass();
      $foo->invokeArgs($obj, array(...));
      ...
    }
    

    你似乎已经知道了,但我只是重申它; 这是一个不好的迹象,如果你需要测试受保护的方法。 单元测试的目的是测试一个类的接口,受保护的方法是实现细节。 也就是说,有些情况下它是有道理的。 如果使用继承,则可以将超类看作为子类提供接口。 所以在这里,你将不得不测试受保护的方法(但从来没有私人的方法)。 解决这个问题的方法是创建一个用于测试目的的子类,并使用它来公开这些方法。 例如。:

    class Foo {
      protected function stuff() {
        // secret stuff, you want to test
      }
    }
    
    class SubFoo extends Foo {
      public function exposedStuff() {
        return $this->stuff();
      }
    }
    

    请注意,您始终可以用组合来替换继承。 在测试代​​码时,处理使用此模式的代码通常要容易得多,因此您可能需要考虑该选项。


    teastburn有正确的方法。 更简单的是直接调用方法并返回答案:

    class PHPUnitUtil
    {
      public static function callMethod($obj, $name, array $args) {
            $class = new ReflectionClass($obj);
            $method = $class->getMethod($name);
            $method->setAccessible(true);
            return $method->invokeArgs($obj, $args);
        }
    }
    

    你可以简单地在你的测试中通

    $returnVal = PHPUnitUtil::callMethod(
                    $this->object,
                    '_nameOfProtectedMethod', 
                    array($arg1, $arg2)
                 );
    
    链接地址: http://www.djcxy.com/p/64549.html

    上一篇: Best practices to test protected methods with PHPUnit

    下一篇: How to share webpage image with description into Facebook page?