关于单元测试:如何在zend中测试受保护的方法

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