How to unit-test protected methods?
有没有办法对类的受保护或私有方法进行单元测试? 就像现在一样,我公开了许多方法,以便能够测试它们,这打破了API。
编辑:实际上在这里回答:使用PHPUnit测试受保护方法的最佳实践
对于受保护的方法,您可以对测试中的类进行子类化:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | class Foo { protected function doThings($foo) { //... } } class _Foo extends Foo { public function _doThings($foo) { return $this->doThings($foo); } } |
并在测试中:
1 2 | $sut = new _Foo(); $this->assertEquals($expected, $sut->_doThings($stuff)); |
使用私有方法会有点困难,您可以使用Reflection API来调用受保护的方法。 此外,有一种观点认为私有方法应该只在重构期间出现,所以应该由调用它们的公共方法覆盖,但只有在测试优先开始时才能真正起作用,并且在现实生活中我们有遗留代码 处理;)
反射api的链接:
http://php.net/manual/en/reflectionmethod.setaccessible.php
此外,此链接看起来很有用:
https://jtreminio.com/2013/03/unit-testing-tutorial-part-3-testing-protected-private-methods-coverage-reports-and-crap/