how to test the protected method in zend
我想在zend项目中测试一个模型,
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <?php //require_once('CustomModelBase.php'); class Application_Model_User extends Custom_Model_Base { protected function __construct() { parent::__construct(); } static function create(array $data) { } static function load($id) { } static function find($name, $order=null, $limit=null, $offset=null) { ); } } |
在application / model文件夹下的模型中,它扩展了一个基类Custom_Model_Base,它与类User位于同一个文件夹下。
在我的测试中,我尝试以这种方式创建User的新对象
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?php class Model_UserTest extends ControllerTestCase { protected $user2; public function setUp() { parent::setUp(); $this->user2 = new Application_Model_User2(); } public function testCanDoTest() { $this->assertTrue(true); } } |
这是CustomModelBase.php:
抽象类Custom_Model_Base
{
protected function __construct($ adapter = null){}
}
它给了我错误,说"PHP致命错误:类'Custom_Model_Base'在第4行的 application models User.php中找不到",我在User.php中包含"CustomModelBase.php",它给了我另一个错误" PHP致命错误:从第13行的D: PHP apache2 htdocs ID24_Xiao tests application models UserTest.php中的上下文'Model_User2Test'调用受保护的Application_Model_User :: __ construct()
那怎么办呢? 任何人都可以提出一些建议吗?
如果您使用5.3.2或更高版本,您可以这样做:
1 2 3 4 5 6 7 8 9 10 | public function testCanDoTest() { // set method"nameOfProctedMethod" to accessible on Class App... $method = new ReflectionMethod( 'Application_Model_User2', 'nameOfProtectedMethod' ); $method->setAccessible(true); $this->assertTrue($method->doSomething()); } |
正如Jeff所说,你可以通过像下面这样公开你的构造函数:
1 | public function __construct() { ... |
您不能在课外召集任何受保护的课程成员
将访问修饰符从protected更改为public
或者创建一个静态函数,该函数将给出该类的实例,例如
1 2 3 | static function getInstance(){ return new Model_UserTest(); } |