如何在zend中测试受保护的方法

时间:2011-05-09 19:02:03

标签: unit-testing zend-framework phpunit

我想在zend项目中测试一个模型,

<?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的新对象

    <?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致命错误:Class'Custate_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()

那我怎么能处理呢?谁能提出一些建议?

3 个答案:

答案 0 :(得分:2)

如果你使用 5.3.2 或更好,你可以这样做:

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());
}

答案 1 :(得分:0)

您不能在课外召集任何受保护的课程成员 将访问修饰符从protected更改为public 或者创建一个静态函数,它将给出该类的实例,例如

static function getInstance(){
    return new Model_UserTest();
}

答案 2 :(得分:0)

正如Jeff所说,你可以通过像下面那样公开你的构造函数:

 public function __construct() { ...